#include <iostream>
#include<cmath>
#include <iomanip>
#define MAXSIZE 1000
using namespace std;
char op[7] = { '+', '-', '*', '/', '(', ')', '=' };
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStackOPTR;
int InitStack(SqStackOPTR &S)
{
S.base=new char [MAXSIZE];
if(!S.base)
{
cout<<"失败!" <<endl;return 0;
}//应该在new后
S.top=S.base;
S.stacksize=MAXSIZE;
return 1;
}
int Push(SqStackOPTR &S,char e)
{
if(S.top-S.base==S.stacksize)
{
cout<<"PUSH ERROR"<<endl;return 0;
}
*S.top=e;
S.top++;
//cout<<"PUSH ing"<<*(S.top-1)<<e<<endl;
return 1;
}
char GetTop(SqStackOPTR S)
{
if(S.top!=S.base)
return *(S.top-1);
}
int Pop(SqStackOPTR &S,char &e)
{
if(S.top==S.base)
{
cout<<"POP ERROR"<<endl;
return 0;
}
S.top--;
e=*S.top;
return 1;
}
int In(char ch) {//判断ch是否为运算符
for (int i = 0; i < 7; i++) {
if (ch == op[i]) {
return 1;
}
}
return 0;
}
char Precede(char theta1, char theta2) {//判断运算符优先级
if ((theta1 == '(' && theta2 == ')') || (theta1 == '=' && theta2 == '=')) {
return '=';
} else if (theta1 == '(' || theta1 == '=' || theta2 == '(' || (theta1
== '+' || theta1 == '-') && (theta2 == '*' || theta2 == '/')) {
return '<';
} else
return '>';
}
double Operate(double first, char theta, double second) {//计算两数运算结果
switch (theta) {
case '+':
return first + second;
case '-':
return first - second;
case '*':
return first * second;
case '/':
return first / second;
}
return 0;
}
double EvaluateExpression(char ch)
{
SqStackOPTR OPTR;
char theta;char x;
InitStack(OPTR);
Push(OPTR, '=');
while (ch != '=' || (GetTop(OPTR) != '=')) //表达式没有扫描完毕或OPTR的栈顶元素不为“=”
{
char sign='+';
if(ch=='-')
{
sign=ch;
}
if(!In(ch))//不是运算符则解析数字字符串然后进操作数栈
{
if(sign=='-')
cout<<-(ch-48);
else
{
cout<<ch-48;
cin>>ch;
}
}
else//如果不是数,则比较运算符优先级
{
switch (Precede(GetTop(OPTR), ch)) //比较OPTR的栈顶元素和ch的优先级
{
case '<':
Push(OPTR, ch);
cin >> ch; //当前字符ch压入OPTR栈,读入下一字符ch
break;
case '>':
Pop(OPTR, theta); //弹出OPTR栈顶的运算符
cout<<theta;
break;
case '=':
Pop(OPTR, x);
cin >> ch; //弹出OPTR栈顶的“(”,读入下一字符ch
break;
} //switch
}
} //while
cout<<endl;
return 0;
}
int main()
{
while (1)
{
char ch;
cin >> ch;
//cout << "请输入要计算的表达式" << endl;
if(ch=='=')break;
double res = EvaluateExpression(ch);
}
return 0;
}
描述
输入一个中缀算术表达式,将其转换为后缀表达式。运算符包括+、-、*、/、(、)、=,参加运算的为小于10的自然数。(只考虑二元运算即可)
输入
多组数据,每组数据一行,对应一个算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。
输出
对于每组数据输出一行,为表达式的后缀式。
输入样例 1
9+(3-1)*3+1/2= 1+2= =
输出样例 1
931-3*+12/+ 12+
原博地址
https://blog.csdn.net/weixin_43673589