栈的应用 — 中缀式转后缀式

由中缀式转换成后缀式,同样使用栈,并运用一些规则来完成。规则介绍如下:

  • 当读到的是操作数,立即输出。
  • 当读到的是运算符,则先从栈中弹出优先级高于自己的运算符(不包含括号),自己入栈。
  • 读到左括号入栈,读到右括号则将栈中元素出栈并输出,直到遇见左括号(括号都不输出)。
  • 输入为空后,将栈元素弹出并输出直到栈空。

注意,最后生成的后缀表达式是考虑了运算符优先级的,再配合逆波兰的无优先级概念这一性质,就能够编写出一个带运算符优先级和括号的简易计算器了。

下面是完整的计算器代码,整型四则运算,可加括号。写了一个下午,幸苦呀~

#include <iostream>

#include <vector>

#include <stack>

#include <ctype.h>

#include <cstdlib>

#include <sstream>

using namespace std;

bool IsDigit(string str)

{

    for(int i = 0; i < str.size(); i++)

        if ((str.at(i) > ‘9‘) || (str.at(i) < ‘0‘))

            return false;

    return true;

}

int main()

{

    stack<string> s;

    vector<string> postfix; // 存放后缀表达式,作为求运算结果的输入

    string input;

    while (cin >> input)

    {

        if (IsDigit(input))

            //cout << input << ‘ ‘;

            postfix.push_back(input);

        else if (input == "(")

            s.push(input);

        else if (input == "+" || input == "-")

        {

            while ((!s.empty()) && (s.top() != "("))

            {   // 弹出优先级大于等于“+”“-”的运算符直到遇到“(”

                //cout << s.top() << ‘ ‘;

                postfix.push_back(s.top());

                s.pop();

            }

            s.push(input);

        }

        else if (input == "*" || input == "/")

        {

            // 在不知道栈是否为空时,不能top()

            while ((!s.empty()) && (s.top() != "(") &&

                        (s.top() != "+") && (s.top() != "-"))

            {   // 弹出运算符“*”“/”直到遇到“(”

                //cout << s.top() << ‘ ‘;

                postfix.push_back(s.top());

                s.pop();

            }

            s.push(input);

        }

        else if (input == ")")

        {

            while ((!s.empty()) && (s.top() != "("))

            {   // 弹出直到遇到“(”

                //cout << s.top() << ‘ ‘;

                postfix.push_back(s.top());

                s.pop();

            }

            s.pop();    // 弹出“(”

        }

        else

        {   // 遇到非法字符

            cout << "Input illegal";

            return -1;

        }

    }

    while (!s.empty())

    {

        //cout << s.top() << ‘ ‘;

        postfix.push_back(s.top());

        s.pop();

    }

    vector<string>::iterator iter = postfix.begin();

    for ( ; iter != postfix.end(); iter++)

        cout << *iter;

#if 1

    cout << endl;

    iter = postfix.begin();

    while (iter != postfix.end())

    {

        input = *iter;

        if (IsDigit(input))

            s.push(input);

        else if ((input == "+") || (input == "-") || (input == "*") || (input == "/"))

        {

            int lhs = atoi((s.top()).c_str());

            s.pop();

            int rhs = atoi((s.top()).c_str());

            s.pop();

            stringstream ss;

            string midval;

            switch (*input.c_str())

            {

                case ‘+‘ :

                    ss << (lhs+rhs);

                    ss >> midval;

                    s.push(midval);

                    break;

                case ‘-‘ :

                    ss << (lhs-rhs);

                    ss >> midval;

                    s.push(midval);

                    break;

                case ‘*‘ :

                    ss << (lhs*rhs);

                    ss >> midval;

                    s.push(midval);

                    break;

                case ‘/‘ :

                    ss << (rhs/lhs);    // 注意除法的操作数有顺序限制

                    ss >> midval;

                    s.push(midval);

                    break;

            }

        }

        iter++;

    }

    cout << s.top();

#endif

    return 0;

}

参考:

《数据结构于算法分析》 P54。

栈的应用 — 中缀式转后缀式,码迷,mamicode.com

时间: 2024-10-11 13:10:37

栈的应用 — 中缀式转后缀式的相关文章

NYOJ467 中缀式变后缀式 【栈】

中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式. 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以"="结束.这个

NYOJ467中缀式变后缀式

中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式. 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以"="结束.这个

南阳OJ 中缀式变后缀式

 /*中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式, 关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看, 这里不再赘述,现在你的任务是将中缀式变为后缀式. 输入第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式, 每个运算式都是以"=&quo

[Code] 中缀式转后缀式

[Code] 中缀式转后缀式 概要 对于一个可带括号的中缀四则运算表达式, 例如30 + 4 / 2 或 30 / ( 4 + 2 ), 下面代码将分别转换为对应的后缀表达形式 30 4 2 / + 和 30 4 2 + /. 要求每个 token 之间以若干个空白符隔开, 输入的中缀式为单行. 代码 import java.util.Scanner; import java.util.Deque; import java.util.ArrayDeque; import java.util.Ma

中缀式变后缀式

中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式. 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以"="结束.这个

NYOJ 467 中缀式变后缀式

做了表达式求值那道题之后做的 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式. 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以"=&quo

恶补C++ 之 自增、自减操作符前缀式与后缀式的区别

相信很多人刚开始学习编程的时候,也是为这个问题烦恼过吧,前缀式与后缀式,在很久之前,式没有办法区别++和--操作符的前缀和后缀的调用的.不过在C++已经得到了扩展. 然而无论式前缀或者后缀,都只有一个参数.为了解决这个问题,C++规定后缀形式有一个int类型的参数,当函数被调用的时候,编译器传递一个0作为int参数给该函数: class UPInt { public: UPInt& operator++();        // ++前缀 const UPInt operator++(int);

Python与数据结构[1] -&gt; 栈/Stack[1] -&gt; 中缀表达式与后缀表达式的转换和计算

中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操作数(数字/字母等),则加入后缀表达式中 若元素为操作符,则压入栈中,此时对比入栈操作符与栈内元素的计算等级,等级大于或等于入栈元素的栈内操作符都将被弹出栈,加入到后缀表达式中 左括号直接入栈,优先级最高,不弹出栈内元素 右括号不入栈,而是弹出所有元素加入后缀表达式,直至遇见匹配的左括号,并弹出左括

表达式求值(中缀式转后缀式,后缀式求值)NYOJ53测试通过

测试地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 package calc; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Scanner; public class Main { //操作符栈 static LinkedList<String>