SDUT-2132 一般算数式转后缀表达式 and STL stack 的基本使用

题目描述

Problem Description

对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input

输入一个算术表达式,以‘#’字符作为结束标志。
Output

输出该表达式转换所得到的后缀式。
Sample Input

a*b+(c-d/e)*f#
Sample Output

ab*cde/-f*+

start

一般的算数表达式转化为后缀(逆波兰)式,是栈的一个经典应用,首先来看一下这个转化过程的方法,表达式自左向右扫描:

  1. 如果是数字(准确说是非运算符,括号)就直接输出为后缀式的一部分;
  2. 如果是 ‘(’ 直接进栈;
  3. 如果是 ‘)’ 则弹出栈顶元素,直到遇到 ‘(’ 为止,并将 ‘(’ 删除; ( ‘(’ , ‘)’ 不会在后缀表达式中 )
  4. 如果当前的运算符的优先级小于等于栈顶元素(且非 ‘(’ )的优先级(优先级简单来说就是我们进行四则运算的规则,乘除高于加减),则将栈顶元素输出,注意这里应该是一个循环,不断的出栈输出,知道遇到栈顶元素优先级大于当前元素或者遇到 ‘(’ 为止;
  5. 如果扫描完成,栈不为空(大部分都不为空)则依次输出栈顶元素;

这就是整个转化过程了 ,以上面题目中的表达式为例子(a*b+(c-d/e)*f):

  1. 首先是a,直接输出;
  2. *入栈;
  3. b 直接输出;
  4. 遇到 +,则与站定比较优先级,* 的优先级更高,所以输出 * ,(循环,这里弹出 * 之后是空栈了,所以结束了),并把 + 入栈 ;
  5. ( 直接入栈;
  6. c 直接输出;
    • 判断优先级,栈顶是 ( ,所以直接入栈;
  7. d 直接输出;
  8. / 比 栈顶元素 - 的优先级高,所以不弹出,直接入栈;
  9. e直接输出;
  10. ) 开始寻找 ) 依次弹出 / - 这时候栈顶为 ( ,把 ( 删除(弹出);
    • 判断栈顶元素,为 + 优先级高于 + ,所以入栈;
  11. f 直接输出;
  12. 至此表达式扫描完成,依次将栈弹出 * +;

这样整个过程就结束了。
代码:

#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~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值