1. 程式人生 > >資料結構實驗十 利用棧實現算術表示式的求值

資料結構實驗十 利用棧實現算術表示式的求值

[問題描述]
利用棧實現算術表示式的求值。可以簡單一些,假設表示式中含有一位整數,以及+、-、*、/、(、)。但不受此限制。(難易程度:中)
[實驗目的]
1、掌握棧的應用。
2、掌握算符優先表示式求值的演算法。
3、掌握字串處理和數值的轉換。
[實驗內容及要求]
1、表示式以字串形式輸入,並以‘#’開始和結束(‘#’也作為演算法來處理)。如輸入:#6+3*(9-7)-8/2#
[測試資料]
1、#6+3*(9-7)-8/2#
2、#(8-2)/(3-1)*(9-6)#
3、#5+(7-3)*6#

//seqstack.h
#include<iostream>
using
namespace std; const int size=10; //size為順序棧的最大儲存大小 template<class T> class seqstack //seqstack類 { private: T data[size]; //data儲存資料 int top; //top為棧頂 public: seqstack(){top=-1;} ~seqstack(){} void push(T x); //入順序棧 T pop(); //出順序棧
T gettop(); //取棧頂 }; template<class T> void seqstack<T>::push(T x) //入順序棧 { data[++top]=x; } template<class T> T seqstack<T>::pop() //出順序棧 { T x; x=data[top--]; return x; } template<class T> T seqstack<T>::gettop()//取棧頂 { return data[top]; } seqstack<int
> OPND; //運算元 seqstack<char> OPTR; //運算子 int precede(char a,char b) //求運算子a,b的優先順序 { int prior[7][7] = {1,1,-1,-1,-1,1,1, //按照 #,),(,/,*,-,+的順序 1,1,-1,-1,-1,1,1, //將每兩個運算子的優先順序關係 1,1,1,1,-1,1,1, //列成矩陣 1,1,1,1,-1,1,1, //-1為<,0為=,1為> -1,-1,-1,-1,-1,0,-2, 1,1,1,1,-2,1,1, -1,-1,-1,-1,-1,-2,0}; int i=-1; int j=-1; switch(a) { case'#':i++; case')':i++; case'(':i++; case'/':i++; case'*':i++; case'-':i++; case'+':i++; default:break; } switch(b) { case'#':j++; case')':j++; case'(':j++; case'/':j++; case'*':j++; case'-':j++; case'+':j++; default:break; } if(i>=0&&j>=0) return prior[i][j]; //返回優先順序,-1為<,0為=,1為> else return -2; } int operate(int a,char alpha,int b) //進行a和b的一種運算 { int ans=0; switch(alpha) { case'+':ans=a+b;break; //加減乘除 case'-':ans=a-b;break; case'*':ans=a*b;break; case'/':ans=a/b;break; default:break; } return ans; } void calvalue() //計算表示式的值 { char ch,x; cin>>ch; if(ch=='#')OPTR.push(ch); //表示式開頭為#,#入棧 cin>>ch; while(ch!='#'||OPTR.gettop()!='#')//當棧頂為#,當前輸入運算子也是#,結束 { if(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'&&ch!='('&&ch!=')'&&ch!='#') { OPND.push(ch-'0');//運算元入棧 cin>>ch; } else //如果是運算子的話,需要判斷優先順序 { switch(precede(OPTR.gettop(),ch)) { case -1: //棧頂優先順序低,當前運算子入棧 OPTR.push(ch); cin>>ch; break; case 0: //優先順序相同說明是'('和')',脫括號 x=OPTR.pop(); cin>>ch; break; case 1: //棧頂優先順序高,進行運算,結果入棧 x=OPTR.pop(); int b=OPND.pop(); int a=OPND.pop(); OPND.push(operate(a,x,b)); break; } } } cout<<"結果是:"<<OPND.gettop()<<endl;//輸出表達式運算結果 } //Text1.cpp #include<iostream> #include"seqstack.h" using namespace std; int main() { cout<<"請輸入表示式:"<<endl; calvalue(); return 0; }