例题:
数据结构实验之栈与队列二:一般算术表达式转换成后缀式
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample Input
ab+(c-d/e)f#
Sample Output
abcde/-f+
代码展示:
#include<bits/stdc++.h>
using namespace std;
int judge(char a,char b)
{
if(b=='(')
{
return 1;
}
else if((a=='%'||a=='*'||a=='/')&&(b=='+'||b=='-'))
{
return 1;
}
else
return 0;
}
int main()
{
char a[10000];
scanf("%s",a);
int n=strlen(a);
stack <char> q;
int i;
for(i=0;i<n;i++)
{
if(a[i]>='a'&&a[i]<='z')
{
printf("%c",a[i]);
}
else if(a[i]=='#')
{
while(!q.empty())
{
printf("%c",q.top());
q.pop();
}
}
else
{
if(q.empty())
{
q.push(a[i]);
}
else
{
if(a[i]=='(')
q.push(a[i]);
else if(a[i]==')')
{
while(q.top()!='(')
{
printf("%c",q.top());
q.pop();
}
q.pop();
}
else if(judge(a[i],q.top())>0)
{
q.push(a[i]);
}
else
{
printf("%c",q.top());
q.pop();
q.push(a[i]);
}
}
}
}
return 0;
}
步骤说明:
举例说明
a*(b+c)/d 转化为后缀表达式为:abc+*d/
变化过程为:
1、碰到运算数a就输出;
2、碰到 * 号放入栈
3、碰到左括号,左括号的优先级比*号的优先级高,so把左括号放进栈中;
4、碰到运算数b,直接输出;
5、当左括号放进栈中的时候,优先级降到最低,so+号的优先级比左括号高,放进栈中,并把c输出;
6、当碰到右括号的时候,把栈顶的元素以此依次输出知直到碰到左括号结束,把左括号从栈中删除;
7、碰到 / 号,除法的优先级和乘法相同,但是要按照从左到右的原则,so输出 * ,把 / 号放进栈中;然后输出运算数d;
8、运算截止,把栈中的所有元素全部输出;
时间复杂度: O(n)