问题描述
中缀表达式就是我们通常所书写的数学表达式,后缀表达式也称为逆波兰表达式,在编译程序对我们书写的程序中的表达式进行语法检查时,往往就可以通过逆波兰表达式进行。我们所要设计并实现的程序就是将中缀表示的算术表达式转换成后缀表示,例如,将中缀表达式
(A 一 (B*C 十 D)*E) / (F 十 G )
转换为后缀表示为:
ABCD十E–FG十/
注意:为了简化编程实现,假定变量名均为单个字母,运算符只有+,-,*,/ 和^(指数运算),可以处理圆括号(),并假定输入的算术表达式正确。
要求:使用栈数据结构实现 ,输入的中缀表达式以#号结束
输入
整数N。表示下面有N个中缀表达式
N个由单个字母、整数和运算符构成的表达式
输出
N个后缀表达式。
测试用例
in:
1
(A-(B*C+D)*E)/(F+G)#
out:
ABCD+E-FG+/
#include<iostream>
#include<stack>
#include<queue>
#include<cctype>
#include<cstring>
using namespace std;
stack<char>OP;
stack<int>Number;
queue<char>q;
int T;
char s[1005];
int t[1005];
int isp(char ch)
{
switch(ch)
{
case('+'):
return 3;
case('-'):
return 3;
case('*'):
return 5;
case('/'):
return 5;
case('%'):
return 5;
case('('):
return 10;
case('^'):
return 8;
}
}
int icp(char ch)
{
switch(ch)
{
case('+'):
return 4;
case('-'):
return 4;
case('*'):
return 6;
case('/'):
return 6;
case('%'):
return 6;
case('('):
return 1;
case('^'):
return 7;
}
}
void trans(char *s)
{
memset(t,0,sizeof(t));
for(int i=0;s[i]!='#';i++)
{
if((isalpha(s[i])||isdigit(s[i]))&&!t[i])
{
cout<<s[i];
continue;
}
else if(i==0&&s[i]=='-'&&(isdigit(s[i+1])||isalpha(s[i+1])))
{
cout<<s[i]<<s[i+1];
t[i+1]=1;
continue;
}
else if(i>0&&s[i]=='-'&&(isdigit(s[i+1])||isalpha(s[i+1]))&&s[i-1]=='(')
{
cout<<s[i]<<s[i+1];
t[i+1]=1;
continue;
}
else if(!(isalpha(s[i])||isdigit(s[i])))
{
if(OP.empty()||s[i]=='(')
{
OP.push(s[i]);
continue;
}
else if(s[i]==')')
{
while(!OP.empty()&&OP.top()!='(')
{
cout<<OP.top();
OP.pop();
}
OP.pop();
}
else
{
while(!OP.empty()&&isp(s[i])<icp(OP.top()))
{
cout<<OP.top();
OP.pop();
}
OP.push(s[i]);
}
}
}
while(!OP.empty())
{
cout<<OP.top();
OP.pop();
}
cout<<endl;
}
int main()
{
cin>>T;
while(T--)
{
int flag=0,j,tag;
while(!OP.empty())
OP.pop();
while(!Number.empty())
Number.pop();
cin>>s;
trans(s);
}
return 0;
}
相关概念 中缀表达式就是我们平时最熟悉的算式表达式,操作符在两个数中间。那么可以想到后缀表达式就是操作符在两个数后面。 例子: 中缀表达式:1 + 2 * 3 后缀表达式:1 2 3 * + 算法过程 栈中存储的是操作符和括号。 从左到右遍历中缀表达式。 遇到括号 遇到左括号,进栈 遇到右括号,一直出栈,直到出栈的元素是右括号 遇到数字 直接输出 遇到操作符 遇到比除‘’(...
新手上路,不足之处希望大家指出,互相学习。 简单说一下思路: 1、把表达式放进数组。对此数组迭代。遇到数字直接放到String中,遇到+、-、*、/、(、)通过一定规则压入,压出栈。 2、简单说一下进栈、出栈的规则: a、如果栈空,或者遇到(,直接将符号压进栈中。 b、出栈:栈顶的符号优先级一定最高,如果栈顶是*,遇到下一个符号是同级的*、/或者是优先级更低的+,-都需要先将*出栈,下一个符号再进...
思路: 1.从左到右获取中缀表达式 2. *,/ 的优先级最高,遇到直接入栈,直到遇到比他优先级低的,依次出栈 3.(,遇到直接入栈,等遇到右括号 )后,将( 后入栈的运算符出栈输出,( 出栈不输出 4.+ - ,如果栈空,直接入栈,否则将栈中优先级不低于它们的运算符依次弹出,直到栈空或遇到 )为止 代码如下所示: 完整程序如下所示:...
中缀表达式转换成后缀表达式,和通过后缀表达式求值需要用到的是数据结构中的一种——栈。如果还不清楚栈是什么的,可以点击了解 : 数据结构栈 目录 为何需要转换为后缀表达式 一、中缀表达式转换成后缀表达式 二、通过后缀表达式求值 为何需要转换为后缀表达式 中缀表达式 : 生活中进行正常加减乘除计算的表达式。如2+(3*4-6/2)。也就是算术表达式 后缀表...
1.算法描述 例如a+b*c这是常见的中缀表达式,但是为了方便计算,在计算机中常要转换为后缀表达式abc*+的形式,那 如何转换呢? 用到的关键数据结构:栈 转换的关键原则: 1.优先级判断:关键是比较运算符的优先级,谁的优先级高,谁就出现在前面上面的表达式中,有括号的时候括号优先级最高,* /次之,+-最后. 在上面的表达式中+的优先级不如*的高,因此,...
...
这三种都是对表达式的记法,区别只在于运算符与操作数的相对位置的差异,中缀表达式就是我们一般使用的相对容易理解的表达式,但是对于计算机来说,就很麻烦了,而前缀和后缀表达式对于计算机来说才是容易理解的版本 举例: 前缀表达式的计算机求值: 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直...