資料結構java語言實現之棧及其應用
棧的結構比較簡單,跟連結串列差不多底層還是一個數組,程式碼實現也比較容易,主要利用的就是他的先進後出的特點,java程式碼如下:
實現還是比較簡單的,下面來幾個實際應用:<span style="font-size:14px;">package Stack; /* * 棧的實現 * 基本思路還是利用陣列來做實現 */ public class MyStack { private static final int DEFUALT_LENGTH=10; private int theLength=0; private Object[] theItems; /* * 構造一個空棧 */ public MyStack(){ clearStack(); } /* * 銷燬一個棧 */ public void destroyStack(){} /* * 清空一個棧 */ public void clearStack(){ theLength=0; ensureCapacity(DEFUALT_LENGTH); } /* * 判斷一個棧是否為空 */ public boolean isEmpty(){ return theLength==0; } /* * 返回棧的長度 */ public int stackLength(){ return theLength; } /* * 返回棧頂元素 */ public Object geTop(){ if(isEmpty()){ throw new IndexOutOfBoundsException(); } Object obj=theItems[theLength-1]; //theLength--; return obj; } /* * 壓棧 */ public void push(Object obj){ if(theLength>=theItems.length){ ensureCapacity(theLength*2+1); } theItems[theLength]=obj; theLength++; } /* * 出棧 */ public Object pop(){ if(isEmpty()){ return null; } Object obj=theItems[theLength-1]; theLength--; //ensureCapacity(theLength); return obj; } /* *陣列的擴充套件 */ public void ensureCapacity(int newCapaciyty){ if(theLength>newCapaciyty){ return; } Object [] old=theItems; theItems=new Object[newCapaciyty]; for(int i=0;i<theLength;i++){ theItems[i]=old[i]; } } } </span>
1 十進位制數轉換成其他任意進位制的數,這個原理很簡單,將迭代的餘數倒過來輸出即可
程式碼如下:
測試程式碼<span style="font-size:14px;">///十進位制數轉換成其他任意進位制的數 private static String toOther(int tenNum, int otherNum) { // TODO Auto-generated method stub MyStack ms=new MyStack(); int result=0; String results=""; while(tenNum!=0){ result=tenNum%otherNum; ms.push(result); tenNum=tenNum/otherNum; } result=0; while(!ms.isEmpty()){ results+=ms.pop()+""; } return results; }</span>
System.out.println("請輸入一個十進位制的數");
int tenNum=sc.nextInt();
System.out.println("請輸入要轉換的進位制數");
int otherNum=sc.nextInt();
String resultnum=toOther(tenNum,otherNum);
System.out.println(resultnum);
結果如下:
請輸入一個十進位制的數
12
請輸入要轉換的進位制數
8
14
2 表示式的求值 ,直接上程式碼
測試程式碼://表示式的的求值 /* * 基本的原理是,構建兩個棧,一個用來存放運算元,一個用來存放運算子 * 依次輸入表示式中的每一個字元, * 若是數字則直接將數字壓入存放運算元的那個棧 * 若是運算子則與運算子的棧頂元素進行比較, * 如果運算子的優先順序低於棧頂元素,就要彈出兩個運算元和一個運算子進行運算操作 * 如果運算子的優先順序高於棧頂元素,就直接將運算子壓棧 * 如果是等於(在次規定只有”(“與“)”是想等的其他的相等取大於) */ /* * 運算操作,根據兩個運算元和傳入的運算子來進行計算 */ private static double operate(double x,double y,char operator){ double result=0.0; switch (operator){ case '+': result=x+y; break; case '-': result=x-y; break; case '*': result=x*y; break; case '/': result=x/y; break; } return result; } /* * 比較兩個運算子的優先順序,第一個引數是存放運算子的棧頂元素,第二個引數是要壓入的元素。 * 正數表示大於,0表示等於,負數表示小於 */ private static int precede(char stackTop,char toPush){ int result=-1; if(stackTop=='-') stackTop='+';//這裡是比較優先順序,所以同一個優先順序的運算子可以看作是一樣的,方便與下面的陣列操作 if(stackTop=='/') stackTop='*'; if(toPush=='-') toPush='+'; if(toPush=='/') toPush='*'; char [] operators=new char[]{'#',')','+','*','('}; if((stackTop=='('&&toPush==')')||(stackTop=='#'&&toPush=='#')){///這裡面只有這一種情況,因為運算子的棧必須是先有(,而且一旦遇到)除非出錯否則就會立刻彈出兩個括號 result=0; }else{ int inOfTop=getIndex(stackTop, operators);//得到棧頂元素的下標 int inOfPush=getIndex(toPush, operators); if(inOfPush==-1||inOfTop==-1){ throw new IndexOutOfBoundsException();//如果返回值是-1則表示不存在,這是出錯的情況,先丟擲異常。 }else{ if(inOfTop>=inOfPush){//相等或者大於軍則返回正值 result=1; }else{ result=-1; } } } return result; } //用於返回字元在再付陣列中的位置 private static int getIndex(char ele,char[] chars){ int index=-1; for(int i=0;i<chars.length;i++){ if(chars[i]==ele){ index=i; break; } } return index; } //判斷是不是字元 private static boolean isChar(char ele){ boolean flage=true; if(ele>='0'&&ele<='9') flage=false; return flage; } /* * 真正開始操作 */ private static double getResult(String evalueExpression){ double result=0.0; //構建兩個棧 MyStack Optr=new MyStack();//存放運算子的棧 Optr.push('#'); MyStack Opnd=new MyStack();//存放數字的棧 int i=0; char[] chars=evalueExpression.toCharArray();//轉換成字元陣列 char operOrType=' '; while(!Optr.isEmpty()){ if(i<chars.length){ operOrType=chars[i++]; } char typeTop=(char) Optr.geTop(); if(!isChar(operOrType))//不是運算子就直接壓入數字棧 Opnd.push(operOrType); else{ if(typeTop=='('&&operOrType!=')'){//但棧頂是(就得另說 Optr.push(operOrType); }else{ switch(precede(typeTop, operOrType)){ case -1: Optr.push(operOrType); break; case 0://相等就意味著是一對括號或者#相遇,那麼必然的括號裡面的運算操作已經完成,所以要脫去括號 Optr.pop(); break; case 1://棧頂的優先順序高就先計算, double num1=Double.parseDouble(Opnd.pop()+"") ; double num2=Double.parseDouble(Opnd.pop()+""); char opType=(char) Optr.pop(); result=operate(num2, num1, opType); Opnd.push(result); i--;//計算完成之後當前的操作符不能丟,因為前面的計算完成之後還要將其壓棧判斷 break; } } } } return result; }
System.out.println("請輸入一個算術表示式以#結尾");
String evalueExpression=sc.nextLine();
System.out.println(getResult(evalueExpression));
結果如下:
請輸入一個算術表示式以#結尾
3*(3+2/4)+9*6/2#
37.5
相關推薦
資料結構java語言實現之棧及其應用
棧的結構比較簡單,跟連結串列差不多底層還是一個數組,程式碼實現也比較容易,主要利用的就是他的先進後出的特點,java程式碼如下: <span style="font-size:14px;">package Stack; /* * 棧的實現 * 基本思路還是
資料結構Java語言描述之迴圈佇列的兩種實現方式
1、佇列的描述 佇列是一種先進先出的儲存資料的結構。如我們現實生活中的排隊就是一個典型的例子。 2、迴圈佇列及其優點 2.1、迴圈佇列是佇列的擴充套件,就是佇列首尾連線,形成一個閉環的圈子。 2.2、優點 充分利用儲存空間。 3、佇列的實現方式
資料結構-C語言實現線性棧
#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100//儲存空間初始化分配量 #define STACKINCREAMENT 10//儲存空間分配增量 #defi
0x00資料結構——C語言實現(棧+字尾表示式計算)
0x00資料結構——C語言實現(棧) 棧的實現 /* 棧(tack)是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧的頂(top)。 對棧的基本操作有Push(進棧)和Pop(出棧)。 Functions: (在連結串列中增加
資料結構C語言實現之鏈式佇列的6種演算法程式碼
#include <stdio.h>#include <stdlib.h>typedef int elemType;/************************************************************************//* 以下是關於佇列連
[資料結構]c語言實現鏈棧的入棧,出棧,清空,銷燬等操作
最近在學習資料結構中的棧,於是在此記錄一下棧鏈式結構的抽象資料型別 /* 棧的抽象資料型別 ADT 棧(stack) Data 同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係 Operation InitStack(*S):初始化
《資料結構與演算法》之棧的應用
1、字串的翻轉(逆序) 根據棧“後進先出”的特點,可以利用棧對字串進行反轉,即實現字串的逆序。 藉助於《資料結構與演算法》之棧(2)中的棧結構,相應實現的程式碼如下: public static void ReverString() { BigStack stac
【資料結構與演算法】之棧的基本介紹及其陣列、連結串列實現---第四篇
一、棧的基本介紹 1、棧的基本概念 棧是一種限制在一端進行插入和刪除操作的線性表資料結構。棧中有兩個比較重要的操作:push(壓棧:將元素壓入棧頂)和pop(彈棧:從棧頂彈出一個元素)。都滿足先進後出、後進先出的特點! 從圖中可以看出,我們常把棧的上面稱為棧
堆的python實現及其應用 資料結構--堆的實現之深入分析
堆的概念 優先佇列(priority queue)是一種特殊的佇列,取出元素的順序是按照元素的優先權(關鍵字)大小,而不是進入佇列的順序,堆就是一種優先佇列的實現。堆一般是由陣列實現的,邏輯上堆可以被看做一個完全二叉樹(除底層元素外是完全充滿的,且底層元素是從左到右排列的)。 堆分為最大堆和最小堆,最大堆
嚴蔚敏資料結構C語言實現棧的基本操作
int main(){ SqStack S; SElemType *e; int n,i; InitStack(&S); printf("請輸入需要入棧的資料個數\n"); scanf("%d",&n); for(i=0;i<n;i++) { sca
資料結構(三)之棧
棧是後進先出,先進後出 棧是一種受限制的線性表,只允許一端插入和刪除資料。 棧的實現也有兩種,用陣列實現叫順序棧;用連結串列實現叫鏈式棧。 // 基於陣列實現的順序棧 public class ArrayStack { private String[] items; // 陣列 private i
資料結構-C語言實現順序表
#include<stdio.h> #include<stdlib.h> #define ERROR 0 #define LIST_INIT_SIZE 100 #define LISTINCREAMENT 10 #define OK 1
資料結構-C語言實現迴圈佇列
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 100 #define OK 1 #define OVERFLOW -1 typedef struct{ int *base;
資料結構C語言實現-2—線性表
Table of Contents 靜態連結串列 線性表順序儲存結構 #include <stdio.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #de
資料結構-c語言實現連結串列的建立,增刪,翻轉
很經典的課題了,這裡直接給出源程式: #include <stdio.h> #include <stdlib.h> #define LIST_MAX_LEN 10 typedef int ElementType; typedef int BOOL; #define TR
資料結構 c語言實現順序佇列(輸數字入隊,字元出隊)
一.標頭檔案seqqueue.h實現 #ifndef __SEQQUEUE_H__ #define __SEQQUEUE_H__ #include<stdio.h> #include<stdlib.h> #include<stdbool.h&g
資料結構C++語言實現——圖
圖 圖的基本概念 圖是資料結構G=(V,E) V(G)是G中結點的有限非空集合 E(G)是G中邊的有限集合 若圖中代表一條邊的偶對是有序的,則稱為有向圖,<u,v>u稱為該邊的始點(尾) ,v稱為邊的終點(頭)。有向邊也稱為弧。
資料結構--堆的實現之深入分析
一,介紹 以前在學習堆時,寫了兩篇文章:資料結構--堆的實現(上) 和 資料結構--堆的實現(下), 感覺對堆的認識還是不夠。本文主要分析資料結構 堆(討論小頂堆)的基本操作的一些細節,比如 insert(插入)操作 和 deleteMin(刪除堆頂元素)操作的實現細節、分析建堆的時間複雜度、堆的
《資料結構和演算法》之棧的鏈式儲存結構
在上篇博文中我已經將棧的順序儲存結構簡單地介紹了一下,也舉了一個進位制轉換的例子,供大家學習參考。這裡將繼續進行棧的有關介紹,本篇博文重點對棧的鏈式儲存結構進行分析。 一,棧的鏈式儲存結構 棧的鏈式儲存結構簡稱棧鏈。棧因為只是棧頂來做插入和刪
資料結構 C語言實現直接插入排序
一、直接插入排序簡介 每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。 第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第三個資料與前兩個數從前向後掃描,把第三個數按大小插入到有序表中;依次進行下去,進行了(