数据结构课程设计其中的一题,表达式计算,包含负数、小括号、大于9的数、单个数、前后缀表达式转换及计算。
不包括浮点数(不难实现,只是懒得改),中大括号(加点优先级判断不难,但检验输入是否合法有点难度),当输入不合法但可以算,如5*-3,而不是5*(-3)时(这点比较难)
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1e5+7;
string a,x,y;
int n;
stack<char>sz,st;
stack<int>p,q;
//优先级判断
int pre(char t){
if(t=='*'||t=='/') return 3;
if(t=='+'||t=='-') return 2;
if(t=='(') return 4;
if(t==')') return 1;
}
int prt(char t){
if(t=='*'||t=='/') return 3;
if(t=='+'||t=='-') return 2;
if(t=='(') return 1;
if(t==')') return 4;
}
//判断是否为一个数
bool cc(char t){
if(t!='*'&&t!='/'&&t!='+'&&t!='-') return t;
return 0;
}
int main(){
cout<<"Please enter an infix expression:"<<endl;
cin>>a; n=a.size();
//中缀表达式转前缀表达式
for(int i=n-1;i>=0;i--){
if(isdigit(a[i])){
int sum=a[i]-'0',k=1;
while(isdigit(a[i-1])){
sum+=(a[i-1]-'0')*pow(10,k);
i--; k++;
}
x.push_back(sum+'0');
}
else if(a[i]=='('){
while(1){
char temp=sz.top();
sz.pop();
if(temp==')') break;
x.push_back(temp);
}
}
else if(a[i]==')') sz.push(a[i]);
else{
if(!sz.empty()&&pre(a[i])<=pre(sz.top())){
x.push_back(sz.top());
sz.pop();
}
sz.push(a[i]);
}
}
while(!sz.empty()){
x.push_back(sz.top());
sz.pop();
}
cout<<"The prefix expression is:"<<endl;
for(int i=x.size()-1;i>=0;i--){
if(cc(x[i])) cout<<int(x[i]-'0')<<' ';
else cout<<x[i]<<' ';
}
putchar('\n');
//中缀表达式转换为后缀表达式
for(int i=0;i<n;i++){
if(isdigit(a[i])){
int sum=a[i]-'0';
while(isdigit(a[i+1])){
sum=sum*10+(a[i+1]-'0');
i++;
}
y.push_back(sum+'0');
}
else if(a[i]=='(') st.push(a[i]);
else if(a[i]==')'){
while(1){
char temp=st.top();
st.pop();
if(temp=='(') break;
y.push_back(temp);
}
}
else{
if(!st.empty()&&prt(a[i])<=prt(st.top())){
y.push_back(st.top());
st.pop();
}
st.push(a[i]);
}
}
while(!st.empty()){
y.push_back(st.top());
st.pop();
}
cout<<"The postfix expression is:"<<endl;
for(int i=0;i<y.size();i++){
if(cc(y[i])) cout<<int(y[i]-'0')<<' ';
else cout<<y[i]<<' ';
}
putchar('\n');
//前缀表达式计算
for(int i=0;i<x.size();i++){
if(cc(x[i])) p.push(x[i]-'0');
else{
int a1=p.top(); p.pop();
int a2=p.top(); p.pop();
int sum=0;
if(x[i]=='*') sum=a1*a2;
else if(x[i]=='/') sum=a1/a2;
else if(x[i]=='+') sum=a1+a2;
else if(x[i]=='-') sum=a1-a2;
p.push(sum);
}
}
cout<<"The prefix expression evaluates to:"<<endl;
cout<<p.top()<<endl;
//后缀表达式计算
for(int i=0;i<y.size();i++){
if(cc(y[i])) q.push(y[i]-'0');
else{
int a1=q.top(); q.pop();
int a2=q.top(); q.pop();
int sum=0;
if(y[i]=='*') sum=a1*a2;
else if(y[i]=='/') sum=a2/a1;
else if(y[i]=='+') sum=a1+a2;
else if(y[i]=='-') sum=a2-a1;
q.push(sum);
}
}
cout<<"The postfix expression evaluates to:"<<endl;
cout<<q.top()<<endl;
}
/*
2*3/(2-1)+3*(4-1)
9+(3-1*2)*3+10/2
*/