当前位置: 首页 > 知识库问答 >
问题:

使用堆栈的C++后缀表达式

孔睿
2023-03-14

我正在为我的一堂计算机科学课开发一个计算后缀表达式结果的程序。该程序使用堆栈ADT来实现这一点。

我已经编写了程序,但相信可能会有错误,因为一些表达式的结果不正确。我不确定我的错误在哪里。

此外,当输入文件为空时,程序将生成一个值32767。那是从哪里来的?

表达式:34+3*值=21。

#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;
    }
}

共有1个答案

裴硕
2023-03-14

一个问题是,在s.pop()-s.pop()语句中(类似地在division中),不能保证先调用哪个s.pop()。因此,从堆栈中移除内容的顺序是不一致的。你应该把它作为两个单独的调用来做。

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

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

 类似资料:
  • 我的讲师给了我一个任务,让我创建一个程序,使用堆栈将表达式和中缀转换为后缀。我制作了堆栈类和一些函数来读取中缀表达式。 但是这个函数,叫做,它负责使用堆栈将数组inFix中的inFix表达式转换为数组postFix中的postfix表达式,并没有做它应该做的事情...你们能帮帮我告诉我哪里做错了吗? 下面是从中缀转换为后缀的函数的代码,是我需要帮助修复的代码: 注意:convertToPostfi

  • 我的讲师给了我一个任务,创建一个程序,使用堆栈将中缀表达式转换为后缀。我制作了堆栈类和一些函数来读取中缀表达式。 但是这个名为inToPos(charstring[])的函数正在创建断点,该函数负责使用堆栈将字符串中缀中的中缀表达式转换为字符串后缀中的后缀表达式。你们能帮帮我,告诉我我做错了什么吗? 这些是我的代码,非常需要您的帮助:) 注:inToPos功能是使用以下算法实现的: 从左到右扫描中

  • 我的任务是使用单链表实现堆栈,将中缀形式的字符串转换为后缀形式。为简单起见,此字符串不包含任何空格。 简而言之,我的算法是: > 按操作顺序使用字符及其关联优先级创建临时节点 如果是操作而不是数字,则将其推到堆栈上/如果是数字,则自动将其附加到后缀字符串 每次将一个字符推送到堆栈上时,如果堆栈的顶部节点的优先级高于下一个字符的临时节点,请将其从堆栈中弹出,并将其附加到后缀字符串中。 这些步骤在手动

  • 我得到了一段代码来破译、解释和提供任何改进建议。我被告知它可以工作,我们不能运行代码来测试它。我很理解它,但只需要有人来运行它,以确保我所理解的是正确的,请获得任何帮助来解释我不理解的地方。我已经做了大量的研究,仍然有一些问题。 代码正在实现用于读取只使用乘法和加法的后缀表达式。然后计算表达式,同时将结果保存到堆栈中。然后打印出结果。操作数被推到堆栈上,然后当它读取运算符时,它从堆栈中弹出前2个操

  • 我正在尝试取一个不固定表达式的字符串,并将其更改为后缀。 我相信大部分代码应该可以工作,但是当queue::enqueue(char,int)被调用时会出现“无法读取内存”的问题,程序无法读取“front”或“freal”。如果我在test_driver.cpp中更改iString,我会得到相同的错误,但是在stack::empty()上。我认为这是一个与类之间的联想有关的问题。 在最后的努力中,

  • 所以我有一个堆栈,它允许典型的Push和Pop函数。我很难理解这一切实际上是如何在代码方面工作的。我在这里看到了这篇文章,最佳答案中的图片/图表,展示了列表是如何被“推”下来的,你指向最新的元素。我有一个 它挂接到结构“节点” 我如何结合一个推拉与"节点*下一步;"?最难理解的是我将如何真正做到这一点。我知道它最初指向空,然后如果我推一个2,4,6,它将是6,4,2,#。掌握如何实际使用链表中的指