题目描述
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample Input
a*b+(c-d/e)*f#
Sample Output
ab*cde/-f*+
start
一般的算数表达式转化为后缀(逆波兰)式,是栈的一个经典应用,首先来看一下这个转化过程的方法,表达式自左向右扫描:
- 如果是数字(准确说是非运算符,括号)就直接输出为后缀式的一部分;
- 如果是 ‘(’ 直接进栈;
- 如果是 ‘)’ 则弹出栈顶元素,直到遇到 ‘(’ 为止,并将 ‘(’ 删除; ( ‘(’ , ‘)’ 不会在后缀表达式中 )
- 如果当前的运算符的优先级小于等于栈顶元素(且非 ‘(’ )的优先级(优先级简单来说就是我们进行四则运算的规则,乘除高于加减),则将栈顶元素输出,注意这里应该是一个循环,不断的出栈输出,知道遇到栈顶元素优先级大于当前元素或者遇到 ‘(’ 为止;
- 如果扫描完成,栈不为空(大部分都不为空)则依次输出栈顶元素;
这就是整个转化过程了 ,以上面题目中的表达式为例子(a*b+(c-d/e)*f):
- 首先是a,直接输出;
- *入栈;
- b 直接输出;
- 遇到 +,则与站定比较优先级,* 的优先级更高,所以输出 * ,(循环,这里弹出 * 之后是空栈了,所以结束了),并把 + 入栈 ;
- ( 直接入栈;
- c 直接输出;
-
- 判断优先级,栈顶是 ( ,所以直接入栈;
- d 直接输出;
- / 比 栈顶元素 – 的优先级高,所以不弹出,直接入栈;
- e直接输出;
- ) 开始寻找 ) 依次弹出 / – 这时候栈顶为 ( ,把 ( 删除(弹出);
-
- 判断栈顶元素,为 + 优先级高于 + ,所以入栈;
- f 直接输出;
- 至此表达式扫描完成,依次将栈弹出 * +;
这样整个过程就结束了。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<iostream>
using namespace std;
int main(){
string str;
cin>>str;
stack<char> s;
int k=0;
for(int i=0; i<str.length()-1; i++){
if(str[i]!='+' && str[i]!='-' && str[i]!='*' && str[i]!='/' && str[i]!='(' && str[i]!=')') //在这个题目中改成>='a' <='z'也行。。
cout<<str[i];
else if(str[i] == '(')
s.push('(');
else if(str[i]==')'){ //右括号,一直输出到遇见左括号为止
while(s.top()!='('){
cout<<s.top();
s.pop();
}
s.pop();
}
else if(str[i]=='*'||str[i]=='/'){ //对于加减乘除,如果遇到乘除,则判断栈顶必须要是乘除(优先级相同才输出)
while(!s.empty() && ( s.top()=='*'||s.top()=='/')){
cout<<s.top();
s.pop();
}
s.push(str[i]); //最后要将这个元素入栈
}
else if(str[i]=='+'||str[i]=='-'){
while(!s.empty() && ( s.top()=='*'||s.top()=='/'||s.top()=='+'||s.top()=='-')){ //如果是加减,栈顶为加减乘除都要弹出(优先级比较关系)
cout<<s.top();
s.pop();
}
s.push(str[i]);
}
}
while(!s.empty()){ //最后输出全部的剩余符号
cout<<s.top();
s.pop();
}
}
这里没有自己实现栈的基本操作,因此在这里简要介绍一下STL 中stack 的使用方法:
使用标准模板库中的栈,要在头文件中添加 stack
.
栈的基本方法无非是新建栈,入栈,出栈,取栈顶元素等:
一切接在代码中…(。・∀・)ノ
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<stack>
using namespace std;
int main(){
stack<int> s; //<>中是栈的元素类型可以是double,string等等
int temp;
for(int i=0; i<5; i++){
cin>>temp;
s.push(temp); //入栈操作
}
cout<<"Size: "<<s.size()<<endl; //栈的大小
cout<<"Top element: "<<s.top()<<endl; //取栈顶元素,不会pop
while(!s.empty()){ //判断栈是否为空
cout<<s.top()<<" ";
s.pop(); //弹出栈顶元素
}
}
end~
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/116837.html