数据结构实验之栈二:一般算术表达式转换成后缀式

来源:互联网 发布:淘宝小店推广 编辑:程序博客网 时间:2024/06/02 02:23

题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
题解:对于这道题你可以用数组来做或者栈模板都行,首先做这道题你应该解决运算符的优先级的问题,你可以自己写一个函数来实现,它说输入一个字符串,你也可以单个输入,其实我偏向后者,仔细理解题意之后,你就能看出遇到字符就输出,遇到运算符如果字符比栈顶的大判断是不是右括号,如果不是直接入栈,是右括号的话,就输出栈内的元素直到遇到左括号。如果栈顶元素比运算符大,如果不是就输出栈顶,再把此时的运算符入栈,如果是左括号直接入栈。
#include<bits/stdc++.h>
using namespace std;
int adjustchar(char ch)
{
if(ch=='-'||ch=='+')
return 1;
if(ch=='*'||ch=='/')
return 2;
if(ch=='(')
return 3;
if(ch==')')
return 4;
}
int main()
{
char ch;
stack<char> str;
int key=0;
while(scanf("%c",&ch)!=EOF&&ch!='#')
{
if(ch>='A'&&ch<='z')
cout<<ch;
else
{
if(str.empty())
{
str.push(ch);
}
else
{
if(adjustchar(str.top())<=adjustchar(ch))
{
if(ch==')')
{
while(str.top()!='(')
{
cout<<str.top();
str.pop();
}
str.pop();
}
else
{
str.push(ch);
}
}
else
{
if(str.top()=='(')
str.push(ch);
else
{
cout<<str.top();
str.pop();
str.push(ch);
}
}
}
}
}
while(!str.empty())
{
cout<<str.top();
str.pop();
}
return 0;
}

0 0