sicily 中缀表达式转后缀表达式

题目描述

将中缀表达式(infix expression)转换为后缀表达式(postfix expression)。假设中缀表达式中的操作数均以单个英文字母表示,且其中只包含左括号‘(‘,右括号‘)’和双目算术操作符+,-,*,/。

输入格式

第一行是测试样例个数n。
以下n行,每行是表示中缀表达式的一个字符串(其中只包含操作数和操作符和左右括号,不包含任何其他字符),长度不超过100个字符。

输出格式

为每一个测试样例单独一行输出对应后缀表达式字符串(其中只包含操作数和操作符,不包含任何其他字符)

样例输入

 将样例输入复制到剪贴板

2
A+B*C-D-E/F
a+(b-c)*d+e/f

样例输出

ABC*+D-EF/-
abc-d*+ef/+

解法一:(已AC)
#include <iostream>
#include <string>
#include <stack>

using namespace std;
bool isoper(char a)
{
    if(a==‘+‘||a==‘-‘||a==‘*‘||a==‘/‘||a==‘%‘)
        return true;
    else return false;
}
int rank(char a)
{
    if(a==‘*‘||a==‘/‘||a==‘%‘)
        return 3;
    else return 1;
}
int main()
{
    stack<char> op;
    string str;
    cin>>str;
    int i,len= str.length();
    for(i=0;i<len;i++)
    {
        if(!isoper(str[i]))
            cout<<str[i];
        else
        {
            if(op.empty()) op.push(str[i]);
            else
            {
                while(!op.empty()&&rank(op.top())>=rank(str[i]))
                {
                    cout<<op.top();
                    op.pop();
                }
                op.push(str[i]);
            }
        }
    }
    while(!op.empty())
    {
          cout<<op.top();
          op.pop();
    }
    return 0;
}

解法二:(目前提提示答案错误,这里先搁置一段,回看)

#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <list>
using namespace std;

int main(){
    string data;
    cin>>data;
    vector<char> temp;
    string out="";//等会再处理 

    list<char> fuhao;
    int count=0;//操作数,为2时就进栈
    for(int i=0;i<data.length();++i){
            if(data[i]==‘+‘||data[i]==‘-‘||data[i]==‘*‘||data[i]==‘/‘||data[i]==‘%‘){
                  fuhao.push_back(data[i]);
            }
            else if(count<2){
                 temp.push_back(data[i]);
                 ++count;
            }
            else if(count==2){
                  if((fuhao.back()==‘*‘||fuhao.back()==‘/‘||fuhao.back()==‘%‘)&&(fuhao.front()==‘+‘||fuhao.front()==‘-‘)){
                       temp.push_back(data[i]);
                        ++count;
                       temp.push_back(fuhao.back());
                       --count;
                       fuhao.pop_back();

                  }
                  else if(fuhao.front()==‘*‘||fuhao.front()==‘/‘||fuhao.front()==‘%‘){
                       temp.push_back(fuhao.front());
                       --count;
                       fuhao.pop_front();
                       ++count;
                       temp.push_back(data[i]);
                  }
                  else if((fuhao.back()==‘+‘||fuhao.back()==‘-‘)&&(fuhao.front()==‘+‘||fuhao.front()==‘-‘)){
                         temp.push_back(fuhao.front());
                         --count;
                         fuhao.pop_front();
                       ++count;
                       temp.push_back(data[i]);

                  }
            }
    }
    while(!fuhao.empty()){
        temp.push_back(fuhao.back());
        fuhao.pop_back();
    }

    for(int i=0;i<temp.size();++i){
        cout<<temp[i];
    }
}                                 

本题虽然很简单,但是在第一次做的时候,忽略了%的情况。多做sicily上的题,看来确实可以锻炼思维,增加严谨性。

此题还有加括号一种,这里暂时搁置。还有另外两种方法。
时间: 2024-08-15 22:38:30

sicily 中缀表达式转后缀表达式的相关文章

中缀表达式转为后缀表达式

** * 中缀表达式转后缀表达式 * * 作用:将一长串计算表达式转换为计算机易于操作的字符序列,用于计算器的设计 *  * 参与转换运算符 * +-/*()^% * * * 使用StringBuilder来保存转换出的后缀表达式 * 使用栈来操作运算符 * * * 转换原则 * 1.上述字符中()没有优先级值,+-优先级值为1,/*%优先级值为2,^优先级值为3 * 2.对于一个待计算的表达式,从左向右逐个检查每个字符 * 3.遇到数字,直接append到StringBuilder * 4.遇

栈的应用之中缀表达式转后缀表达式

1,中缀表达式的定义及为什么要将中缀表达式转换为后缀表达式? 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值.对计算机来说,计算前缀或后缀表达式的值要比中缀表达式简单. 比如,计算机计算后缀表达式的过程如下----后缀表达式的计算机求值: 从左

ZH奶酪:Python 中缀表达式转换后缀表达式

实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序: 一个输入中缀表达式inOrder 一个输出池pool 一个缓存栈stack 从前至后逐字读取inOrder 首先看一下不包含括号的: (1)操作数:直接输出到pool (2)操作符:判断当前操作符与stack[top]操作符的优先级 <1>当前操作符优先级高于stack[top]:将当前操作符添加到stack中: <2>当前操作符优先级低于或等于stack[top]:从stack[top]开始出栈,直到stack[to

经典白话算法之中缀表达式和后缀表达式

一.后缀表达式求值 后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储. 假定待求值的后缀表达式为:6  5  2  3  + 8 * + 3  +  *,则其求值过程如下: (1)遍历表达式,遇到的数字首先放入栈中,依次读入6 5 2 3 此时栈如下所示: (2)接着读到"+",则从栈中弹出3和2,执行3+2,计算结果等于5,并将5压入到栈中. (3)然后读到8(数字入栈),将其直接放入栈中. (4)读到"*",弹出8和5,执行8*5,并将结果40压入栈中

[转]中缀表达式、前缀表达式、后缀表达式的相互转换

--------------------------------后缀转中缀---------------------------------------------- 1.建立一个栈,从左向右扫描后缀表达式,遇到运算数则压入栈: 2.遇到运算符就把栈顶两个元素出栈,执行运算,得到的结果作为新的运算符再压入栈: 3.依次走到表达式结尾: 例:把逆波兰式(即后缀表达式)ab+c*转换为中缀表达式: 1)a入栈(0位置) 2)b入栈(1位置) 3)遇到运算符"+",将a和b出栈,执行a+b的

数据结构中缀表达式转后缀表达式以及后缀转中缀表达式

最近一直在看数据结构这本书,我相信,对于每个程序员来说,数据结构都尤为重要.为什么要学,可以看看这位博友的认识http://blog.csdn.NET/sdkfjksf/article/details/54380659 直入主题:将中缀表达式转为后缀表达式 以及将后缀表达式转为前缀表达式的实现. 关于后缀转中缀,中缀转后缀的理论介绍,请先阅读其互转的理论知识,或者我转发的这篇文章,这里不再累赘,最好参考<数据结构与算法描述Java语言版>,接下来将会用java写. 一.首先,怎么实现中缀表达式

数据结构——栈——中缀表达式和后缀表达式

什么是中缀表达式,什么是后缀表达式 我们一般看见的多项式计算都是中缀表达式构成的:1+2*3+4/3 类似这种,为什么说是中缀呢?因为它的计算符号都是在两个数中间的. 那么自然而然的明白了后缀表达式是一种计算符号在两个数后面的. 如123*+43/+ 中缀表达式和后缀表达式有什么关系? 其实仔细你就会发现,上面给出的式子其实都是一样的,只是计算的顺序在后缀表达式中你看不懂而已. 因为我们习惯去看中缀表达式的计算. 其实他们之间是可以互相转换的.他们也可以表达同一个意思,同一个计算式子. 为什么会

表达式的计算(中缀表达式转为后缀表达式或逐步计算)

算数表达式的计算,也是很基础的一个问题.花了点时间写了下. 网上很多正确代码.但没有详细说明.虽然不复杂,但是还是写详细点.只有仔细思考过.问题才会在头脑中,觉得简单. 基本有2种方法. 1)中缀表达式转为后缀表达式,是最简洁有力的方法. 2)符合人的计算思路的逐步方法,不推荐使用,只适合锻炼下逻辑能力. 一.中缀表达式转为后缀表达式,是最简洁有力的方法. //更简洁通用的算法,就是把中缀表达式转换为后缀表达式.后缀表达式:不包含括号,运算符放在两个运算对象的后面. //一,无括号的n级符号算法

将中缀表达式转换为后缀表达式,然后利用栈对表达式求值。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js.js"></script> </head> <body> 输入中缀表达式空格分隔 例如 2 + 3 <input type=

中缀表达式转换为后缀表达式(1042)

描述 中缀表达式是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法.后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *.利用栈结构,将中缀表达式转换为后缀表达式.(测试数据元素为单个字符) input 中缀表达式 output 后缀表达式 样例输入 A+(B-C/D)*E 样例输出 ABCD/-E