第2关:STL模板之栈stack实例:中缀表达式转后缀表达式


任务描述

本关任务:熟练掌握STL模板库中栈stack的基本操作,并利用栈实现中缀表达式转化为后缀表达式。

相关知识

为了完成本关任务,你需要掌握:1.中缀表达式转后缀表达式。

中缀表达式转后缀表达式

与转换为前缀表达式相似,遵循以下步骤:

  • (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2
  • (2) 从左至右扫描中缀表达式;
  • (3) 遇到操作数时,将其压入S2
  • (4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
  • (4-1) 如果S1为空,或栈顶运算符为左括号(,则直接将此运算符入栈;
  • (4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
  • (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
  • (5) 遇到括号时:
  • (5-1) 如果是左括号(,则直接压入S1
  • (5-2) 如果是右括号),则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃;
  • (6) 重复步骤(2)至(5),直到表达式的最右边;
  • (7) 将S1中剩余的运算符依次弹出并压入S2
  • (8) 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)。

例如,将中缀表达式1+((2+3)*4)-5转换为后缀表达式123+4*+5-的过程如下:

编程要求

本关的编程任务是补全右侧代码片段mainBeginEnd中间的代码,具体要求如下:

  • 读取中缀表达式,并基于栈的插入、删除等基本操作实现中缀表达式转化为后缀表达式,表达式中所有的操作数为单一的数字:0~9,运算符仅包含:+ - * ( )
测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:1+((2+3)*4)-5 预期输出:123+4*+5-

输入格式:中缀表达式 输出格式:后缀表达式,末尾换行\n

//
//  main.cpp
//  step2
//
//  Created by ljpc on 2018/8/31.
//  Copyright © 2018年 ljpc. All rights reserved.
//

#include <iostream>
#include <stack>
#include <cstring>
#include <algorithm>
using namespace std;

int main(int argc, const char * argv[]) {
    
    // 请在这里补充代码,完成本关任务
    /********* Begin *********/
    string s;
    stack<char> s1;
    stack<char> s2;
    cin >> s;
    for ( int i = 0; i<s.size(); i++)// 从左到右扫描
    {
        L1:
        if(s[i]>='0' && s[i]<='9')
        {
            s2.push(s[i]);
        }
        else
        {
            if(s[i]=='('||s1.empty()||s1.top()=='(')
            {
                s1.push(s[i]);
            }
            else if(s[i]==')')
            {
                while(s1.top()!='(')
                {
                    s2.push(s1.top());
                    s1.pop();
                }
                s1.pop();
            }
            else if((s1.top()=='+'||s1.top()=='-') && s[i]=='*')
            {
                s1.push(s[i]);
            }
            else
            {
                s2.push(s1.top());
                s1.pop();
                goto L1;
            }
        }
    }
    while(!s1.empty())
    {
        s2.push(s1.top());
        s1.pop();
    }
    char a[s2.size()];
    int len=s2.size();
    for(int i=s2.size()-1;i>=0;i--)// 因为要逆序输出,所以先把栈逆序存在一个数组中
    {
        a[i] = s2.top();
        s2.pop();
    }
    for(int j=0;j<len;j++)
    {
        printf("%c",a[j]);
    }
    /********* End *********/

    return 0;
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值