数据结构实验之栈与队列二:一般算术表达式转换成后缀式
Time Limit: 1000 msMemory Limit: 65536 KiB
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample Input
a*b+(c-d/e)*f#
Sample Output
ab*cde/-f*+
中缀表达式转化为后缀表达式步骤: 一.左到右遍历,遇到字母直接输出; 二.遇到操作符: 1.若栈为空或栈顶元素为(,则直接压栈. 2.若栈顶元素为普通操作符,则比较优先级,若待压栈的操作符比栈顶操作符优先级高,则直接压栈,否则将栈顶元素出栈,再接着比较继续和栈顶元素的优先级. 3.若遇到),则依次弹出栈顶的运算符,直到遇到(为止,此时将这一对括号丢弃. 4. 最后将栈中剩余的运算符依次弹出栈. #include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a;
stack<char>s;
cin>>a;
for(int i=0; a[i]!='#'; i++)
{
if(a[i]>='a'&&a[i]<='z')
cout<<a[i];
else if(a[i]=='(')
s.push(a[i]);
else if(a[i]==')')
{
while(s.top()!='(')
{
cout<<s.top();
s.pop();
}
s.pop();
}
else if(a[i]=='*'||a[i]=='/')
{
while(!s.empty()&&(s.top()=='/'||s.top()=='*')&&s.top()!='(')
{
cout<<s.top();
s.pop();
}
s.push(a[i]);
}
else if(a[i]=='+'||a[i]=='-')
{
while(!s.empty()&&s.top()!='(')
{
cout<<s.top();
s.pop();
}
s.push(a[i]);
}
}
while(!s.empty())
{
cout<<s.top();
s.pop();
}
return 0;
}
本文介绍了一种算法,用于将包含基本算术运算的中缀表达式转换为等价的后缀表达式。具体步骤包括扫描输入字符串,区分操作数与运算符,并利用栈来管理运算符的优先级。
401

被折叠的 条评论
为什么被折叠?



