這個例子是來自於嚴蔚敏的《數據結構》的棧那一節。 但是我進行了一些簡單的修改,確保編譯通過。
目的:利用棧 計算 “3*(7-2)”這樣的字符串的算術運算的結果。 共有3個代碼文件,如下:
1、mystack.h
#pragma once #define maxsize 30 typedef struct { char data[maxsize+1]; int top; }Stack; int Push(Stack& S,char x); int Pop(Stack& S,char& x); char readtop(Stack S);
2、mystack.cpp
#include "mystack.h" #include "stdio.h" int Push(Stack& S,char x) { if (S.top==maxsize) { printf("overflow\n"); return(0); } S.data[++S.top]=x; return(1); } int Pop(Stack& S,char& x) { if(S.top==0) { printf("undertflow\n"); return(0); } x=S.data[S.top]; S.top--; return(1); } char readtop(Stack S) { char a; a=S.data[S.top]; return(a); }
3、 caclstack.cpp
#include#include #include "mystack.h" using namespace std; double operate(char ch, double x,double y); int precede(char p1,char p2); double calcul(char a[]);
//這是進行測試的main 函數 int main() { char tmp[]="3*(7-2)#"; // 輸入的字符串一定要以# 結尾。 // char tmp[]="3*(7-2)+5*2#"; double rst = calcul(tmp); cout<'#' || readtop(S1)<>'#') while(r != '#' || readtop(S1) != '#') { if(r<='9' && r>='0') { x=0; while(r<='9' && r>='0') { x=x*10+r-'0'; r=a[++I]; } Push(S2,x); } else switch(precede(readtop(S1),r)) { case -1: Push(S1,r); r=a[++I]; break; //把運算符放進棧1 case 0: Pop(S1,ch); r=a[++I]; //r=a[I]; break; //彈出一個運算符 case 1: Pop(S1, ch); Pop(S2, x1); Pop(S2, x2); Push(S2,operate(ch, x2,x1)); //r=a[++I]; r=a[I]; break; } } return(readtop(S2)); }
以上代碼在VS 下編譯通過,並且執行結果正確。
注意:本文的棧 是用的自定義 的mystack。
另外更多原理 請參考 嚴蔚敏的數據結構相關章節。