nyoj467
中缀式变成后缀式输出
思路模拟出栈入栈进行计算
将运算符与数字分别存入两个栈中
1 当遇到数字时就直接入栈(数字栈)
2 当运算符栈中为空时 第一个字符要入栈
3 当一个运算符的运算等级 大于或等于 栈顶字符 时 (循环判断)
a 当栈顶元素不为 ( 时 输出
else 就让该运算符入栈(退出循环)
4 当一个运算符的预算等级小于 栈顶运算符时
a 当栈顶为 ) 时 输出
else 入栈
5 最后将运算符栈中的运算符全部用掉
输出
#include<bits/stdc++.h> using namespace std; char op[10000]; char s[2000]; int judge(char c) { if(c=='+'||c=='-')return 1; if(c=='/'||c=='*')return 2; if(c=='(')return 3; else return 4; } int main() { int n; while(~scanf("%d",&n)) { while(n--) { scanf("%s",s); int top=0; for(int i=0; s[i]!='=';) { if(s[i]>='0'&&s[i]<='9'||s[i]=='.') { while(s[i]>='0'&&s[i]<='9'||s[i]=='.') printf("%c",s[i++]); printf(" "); continue; } if(top==0) { op[++top]=s[i++]; continue; } if(judge(op[top])>=judge(s[i])) { while(judge(op[top])>=judge(s[i])&&top>0) //循环判断 { //排除 5+6*7-9 这一类的情况 输出 5 6 7*+9- //用if的话会出现 5 6 7* 9 - +; error if(op[top]!='(') printf("%c ",op[top--]); else break; } op[++top]=s[i]; i++; } else { if(s[i]==')') { while(op[top]!='(') printf("%c ",op[top--]); top--; } else op[++top]=s[i]; i++; } } while(top) printf("%c ",op[top--]); printf("=\n"); } } return 0; }
nyoj35
表达式求值
#include<bits/stdc++.h> using namespace std; char op[10000]; double mi[10000]; char s[10000]; int judge(char c) { if(c=='+'||c=='-')return 1; if(c=='/'||c=='*')return 2; if(c=='(')return 3; else return 4; } void solve(char op[],double mi[],int &tail,int &top) { //通过两个栈的出栈与入栈 进行后缀式计算求值 if(op[top]=='+') mi[tail-1]=mi[tail-1]+mi[tail]; if(op[top]=='-') mi[tail-1]=mi[tail-1]-mi[tail]; if(op[top]=='*') mi[tail-1]=mi[tail-1]*mi[tail]; if(op[top]=='/') mi[tail-1]=mi[tail-1]/mi[tail]; top--; //字符栈出栈 tail--; //数字栈出栈 } int main() { int n; while(~scanf("%d",&n)) { while(n--) { scanf("%s",s); int top=0,tail=0; for(int i=0; s[i]!='=';) { double sum=0; if(s[i]>='0'&&s[i]<='9'||s[i]=='.') //数字的入栈 { while(s[i]>='0'&&s[i]<='9') { sum*=10; sum+=s[i++]-'0'; } if(s[i]=='.') { i++; double bits=0.1; while(s[i]>='0'&&s[i]<='9') { sum+=bits*(s[i++]-'0'); bits*=0.1; } } mi[++tail]=sum; //入栈 continue; } if(top==0) { op[++top]=s[i++]; //运算符的入栈 continue; } if(judge(op[top])>=judge(s[i])) { while(judge(op[top])>=judge(s[i])&&top>0) { if(op[top]!='(') { //后缀式计算 solve(op,mi,tail,top); } else break; } op[++top]=s[i]; i++; } else { if(s[i]==')') { while(op[top]!='(') { //后缀式计算 solve(op,mi,tail,top); } top--; } else op[++top]=s[i]; i++; } } while(top) { solve(op,mi,tail,top); } printf("%.2lf\n",mi[tail]); } } return 0; }