資料結構實驗十 利用棧實現算術表示式的求值
阿新 • • 發佈:2019-01-27
[問題描述]
利用棧實現算術表示式的求值。可以簡單一些,假設表示式中含有一位整數,以及+、-、*、/、(、)。但不受此限制。(難易程度:中)
[實驗目的]
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;
}