栈实现表达式求值

使用键盘输入数学表达式(含数字,四种运算符+、-、、/和小括号,其中运算数都是一位数(0~9)),将数学表达式转化成后缀表达式输出,利用后缀表达式求表达式的值并输出。

输入格式:

输入正确的表达式(可以有空格)后回车,得到后缀表达式和结果。输入括号缺失的表达式,输出"ERROR:缺少括号"。输入两个除括号外运算符连续的表达式,输出"ERROR:表达式缺操作数"。

输出格式:

请在这里描述输出格式。例如:对每一组输入,在一行中输出A+B的值。

输入样例:

在这里给出一组输入。例如:

5*(8-(3+2))
源代码

#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;
}

心得体会

通过这次的实验,关于在栈中输入四种运算符的以及小括号,将其转化成数学表达式,按照数学运算先乘除后加减的方式输出,在缺少括号时将报错,按照栈的先进后出后进先出的规则输出,进行判断,记录下运算符号的调用次数。
依次读入表达式的每个字符,表达式须以'#'结尾,若是操作数则入栈opval,若是运算符,则将此运算符c与opter的栈顶元素top比较优先级后执行相应的操作,(具体操作如下:(i)若top的优先级小于c,即top<c,则将c直接入栈opter,并读入下一字符赋值给c;(ii)若top的优先级等于c,即top=c,则弹出opter的栈顶元素,并读入下一字符赋值给c,这一步目的是进行括号操作;
通过这次的实验我对于栈的认识更加深刻,对于栈的实际应用有了新的认识。

posted @ 2021-11-22 22:47  清梦韶华  阅读(343)  评论(0编辑  收藏  举报