使用堆栈的C ++ Postfix表达式

时间:2013-10-15 01:27:38

标签: c++ postfix-notation

我正在开发一个程序来计算我的一个计算机科学课程的后缀表达式的结果。该程序使用堆栈ADT来完成此任务。

我已编写该程序,但相信可能存在错误,因为某些表达式的结果不正确。我不确定我的错误在哪里。

此外,当输入文件为空时,程序产生的值为32767.它来自哪里?

表情:3 4 + 3 * 值= 21。

表达式:5 4 3 2 1 - + / * 值= 0.(应为5)

表达:9 5 2 4 + - 2 * * 值= 18.(应为-18)

标题文件:

#ifndef STACK_H
#define STACK_H

#include <cstdlib>
#include <iostream>

class Stack
{
    public:
        typedef int Item;
        static const int CAPACITY = 50;

        // Constructor
        Stack() { used = 0; }

        // Modification Member Functions
        void push(Item entry) {
            data[used] = entry;
            ++used;
        }
        Item pop() {
            if(!empty())
            {
                --used;
                return data[used];
            }
        }

        // Constant Member Functions
        bool empty() const { return used == 0; }
        int size() const { return used; }

    private:
        // Data Members
        Item data[CAPACITY];
        int used;
};
#endif

主程序:

#include <cstdlib>
#include <iostream>
#include <fstream>
#include "stack.h"
using namespace std;

int main()
{
    Stack s;
    string input;
    ifstream infile;
    int final, operand1, operand2, result;
    char infile_name[80];

    cout << "Enter input file name: ";
    cin >> infile_name;
    cout << endl;

    infile.open(infile_name);
    while(!infile)
    {
        cout << "Could not open file." << endl;
        return 0;
    }

    while (!infile.eof())
    {
        getline(infile, input);
        cout << "Expression: ";
        for (int i = 0; i < input.length(); i++)
        {
            cout << input[i];
            if(input[i] == '1' || input[i] == '2' || input[i] == '3' || input[i] == '4' || input[i] == '5' || input[i] == '6' || input[i] == '7' || input[i] == '8' || input[i] == '9')
                s.push(input[i] - '0');
            if(input[i] == '+')
                s.push(s.pop() + s.pop());
            if(input[i] == '-')
                s.push(s.pop() - s.pop());
            if(input[i] == '*')
                s.push(s.pop() * s.pop());
            if(input[i] == '/')
                s.push(s.pop() / s.pop());
        }
        final = s.pop();
        cout << endl << "Value = " << final << "." << endl << endl;
    }
}

2 个答案:

答案 0 :(得分:3)

一个问题是在s.pop() - s.pop()语句中(以及类似的除法),无法保证首先调用s.pop()。因此,从堆栈中删除事物的顺序并不一致。你应该把它做成两个单独的电话。

auto oper1 = s.pop();
auto oper2 = s.pop();
s.push(oper1-oper2);

您的错误结果是由于在您的情况下以错误的顺序执行了这两项操作。

答案 1 :(得分:2)

while (!infile.eof())之类的代码几乎总是错误的。它通常会两次读取输入的最后一项(尽管即使这是不可靠的)。

首先改变:

while (!infile.eof())
{
    getline(infile, input);

为:

while (getline(infile, input))

并查看它是否效果不佳。

另请注意,如果堆栈为空,则stack.pop()不会返回值:

Item pop() {
    if (!empty())
    {
        --used;
        return data[used];
    }
}

如果(例如)你有额外的运算符,你会尝试使用一个没有实际返回值的值,导致未定义的行为。