人:中缀表达式
计算机:后缀表达式
需要进行中缀转后缀,再计算。无论哪一步都需栈:
对于(3 + 4) × 5 - 6
一 中缀转后缀
涉及的栈用来存储符号如“+ - × / ( )”
思想:
遇见数字输出;遇见符号入栈
当空栈或者符号是左括号时直接入栈 ;
当是运算符时将要入栈的符号需要大于栈内符号否在现将栈内比该运算符大或者等的出栈输出,然后再入栈;
当运算符是右括号时,将栈内直到第一个左括号的符号出栈,并输出非括号的符号
算法:
//中缀表达式改成后缀表达式
void mid2after(char *a, char *&b){
int l=strlen(a);
int i=0,j=0;
sqstack s;
initstack(s);
while(i<l&&s.top>=-1){
if(a[i]>='0'&&a[i]<='9'){b[j++]=a[i++];if(a[i]<'0'||a[i]>'9')b[j++]=' ';}
else{
if(s.top==-1||a[i]=='(')s.data[++s.top]=a[i++];
else if(a[i]=='*'||a[i]=='/'){while(s.data[s.top]=='*'||s.data[s.top]=='/'){b[j++]=s.data[s.top--];}s.data[++s.top]=a[i++];}
else if(a[i]=='+'||a[i]=='-')
{while(s.data[s.top]=='+'||s.data[s.top]=='-'||s.data[s.top]=='*'||s.data[s.top]=='/'){b[j++]=s.data[s.top--];}
s.data[++s.top]=a[i++];}
else if(a[i]==')'){i++;while(s.data[s.top]!='('){b[j++]=s.data[s.top--];}
s.top--;}
else if(a[i]==' ')i++;
else {cout<<"inlegal input!";return;}
}
}
while(s.top>-1){b[j++]=s.data[s.top--];}
}
二 后缀求值
后缀表达式求值栈主要用来存储数值
思想:
每遇见数字即入栈;
遇见运算符即出栈前两位运算,结果再入栈
注意后缀表达式木有括号。
算法:
//后缀求值
int get_after(char *b){
int l=strlen(b);
sqstack s;
initstack(s);
int i=0,ss;
while(i<l&&s.top>=-1){
if(b[i]>='0'&&b[i]<='9'){
ss=0;
while(b[i]>='0'&&b[i]<='9')
{
int j=1;
j=(b[i]-'0');
ss=ss*10+j;
i++;
// cout<<ss<<" ";
}
s.data[++s.top]=ss;
}
else {int t=s.data[s.top];
switch (b[i])
{case '+':s.data[--s.top]=s.data[s.top]+t;break;
case '-':s.data[--s.top]=s.data[s.top]-t;break;
case '*':s.data[--s.top]=s.data[s.top]*t;break;
case '/':{if(t==0)return -100;s.data[--s.top]=s.data[s.top]/t;break;
}
case ' ':break;
default:{cout<<"error! "<<b[i];return -100;}
}
i++;}
}
if(s.top>-1)return s.data[s.top];
}