演算法與資料結構實驗二 棧的應用
實驗專案名稱:實驗二 棧的應用
一、 實驗目的
1.掌握棧的定義及實現
2.掌握利用棧求解算術表示式。
二、 實驗內容
7-2 棧實現表示式求值
使用鍵盤輸入數學表示式(含數字,四種運算子+、-、、/和小括號,其中運算數都是一位數(0~9)),將數學表示式轉化成字尾表示式輸出,利用字尾表示式求表示式的值並輸出。
輸入格式:
輸入正確的表示式(可以有空格)後回車,得到字尾表示式和結果。輸入括號缺失的表示式,輸出"ERROR:缺少括號"。輸入兩個除括號外運算子連續的表示式,輸出"ERROR:表示式缺運算元"。
輸出格式:
請在這裡描述輸出格式。例如:對每一組輸入,在一行中輸出A+B的值。
輸入樣例:
在這裡給出一組輸入。例如:
5*(8-(3+2))
輸出樣例:
在這裡給出相應的輸出。例如:
5832+-*
15
三、 設計文件
四、 源程式
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const int N=100010;
string split(string s){
string ss;
for(int i=0;i<s.size();i++){
if(s[i]==32) continue;
ss+=char(s[i]);
}
return ss;
}
bool ck1(string s){
int cnt=0;
for(int i=0;i<s.size();i++){
if(s[i]=='(') cnt++;
else if(s[i]==')') cnt--;
}
return cnt==0;
}
bool ck2(string s){
for(int i=0;i<s.size();i++){
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){
if(i==0||i==s.size()-1||i&&(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/')){
return 0;
}
}
}
return 1;
}
int pri(char ch){return ch=='*'||ch=='/'?2:1;}
char ch[N];
int cnt;
string cg(string s){
string ss;
for(int i=0;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9'){
ss+=char(s[i]);
}else{
if(s[i]=='('){
ch[cnt++]='(';
}else if(s[i]==')'){
while(ch[cnt-1]!='('){
ss+=ch[--cnt];
}
cnt--;
}else{
char c=char(s[i]);
if(cnt>0&&pri(c)<=pri(ch[cnt-1])){
while(cnt>0&&ch[cnt-1]!='('&&pri(c)<=pri(ch[cnt-1])){
ss+=ch[--cnt];
}
}
ch[cnt++]=c;
}
}
}
while(cnt>0){
ss+=ch[--cnt];
}
return ss;
}
int op(int x,int y,char ch){
if(ch=='+') return x+y;
else if(ch=='-') return x-y;
else if(ch=='*') return x*y;
else return x/y;
}
int a[N],ct;
int op(string s){
for(int i=0;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9'){
a[ct++]=s[i]-48;
}
else{
int x=a[ct-2],y=a[ct-1];
ct-=2;
a[ct++]=op(x,y,char(s[i]));
}
}
return a[0];
}
int main(){
string s;
getline(cin,s);
s=split(s);
if(!ck1(s)){
cout<<"ERROR:缺少括號";
return 0;
}
if(!ck2(s)){
cout<<"ERROR:表示式缺運算元";
return 0;
}
string ss=cg(s);
cout<<ss<<endl;
cout<<op(ss);
return 0;
}