69,371
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
int Priority(char); //将运算符的优先级转换为可比较大小的数字
int main(void)
{
char infix[100], suffix[100]; //分别用于接收中缀表达式和后缀表达式
char stack[100] = { 0 };
int inlen = 0, suflen = 0;
cin >> infix; //接收中缀表达式
puts(infix);
int pti = -1; //创建一个空栈,stcak[pti]为栈顶
for (inlen = 0; infix[inlen]; inlen++) //依次检查每一个元素
{
if (infix[inlen] >= 'A' && infix[inlen] <= 'Z') { //操作数A--Z
suffix[suflen++] = infix[inlen];
} else if (Priority(infix[inlen]) > 0) //运算符+ - * / ^(乘方)
{
while (pti >= 0 && stack[pti] != '(' && Priority(stack[pti]) > 0 && Priority(infix[inlen]) <= Priority(stack[pti])) //栈不空且栈顶元素不为'('且满足优先级条件
suffix[suflen++] = stack[pti--];
stack[++pti] = infix[inlen]; //栈为空的时候,当前运算符入栈
} else if (infix[inlen] == '(') //为(
stack[++pti] = infix[inlen];
else if (infix[inlen] == ')') //为)
{
while (pti >= 0 && stack[pti] != '(')
suffix[suflen++] = stack[pti--]; //退栈并且输出出栈的运算符
if (stack[pti]>=0)
pti--;
else
cout << "Error\n"; //做一次退栈操作
} else //其他字符
cout << "Error\n";
}
while (pti >= 0 && stack[pti] != '(') //栈不空且栈顶元素不为'('时
suffix[suflen++] = stack[pti--]; //退栈并且输出出栈的运算符
suffix[suflen] = '\0';
if (pti >= 0) //如果栈不空,报错
cout << "Error\n";
//测试
for (int i = 0; i <= suflen; i++)
cout << suffix[i];
//测试
cout<<endl;
return 0;
}
int Priority(char ch) //将运算符的优先级转换为可比较大小的数字
{
if (ch == '+' || ch == '-')
return 1;
else if (ch == '*' || ch == '/')
return 2;
else if (ch == '^')
return 3;
else
return 0;
}
问题是出在不细心。
对比一下这两个表达式的区别:
else if (Priority(infix[inlen]>0))
和
else if (Priority(infix[inlen])>0)
的区别;