使用堆栈计算表达式

时间:2017-01-09 18:35:51

标签: c++ stack

您好我试图用c ++编写程序,使用堆栈计算表达式,但结果是一个随机数(地址存储器可能但它不是指针)。 这是Stack模板`

#ifndef STACK_H_
#define STACK_H_
template <class Item>
class Stack {
public:
    static const size_t Capacity=100;
    Stack(){used=0;};
    void push(const Item& insert){data[used]=insert; used++;};
    void pop(){used--;};
    Item top(){return data[used-1];};
private:
    Item data[Capacity];
    size_t used;
};

#endif /* STACK_H_ */
`

这是使用2个函数的主要部分

#include <iostream>
#include <cstring>
#include "Stack.h"
using namespace std;

double manage_stack(istream& insert);
void evaluate(Stack<double> numbers, Stack<char> operations);

int main(){
    double result;
    result=manage_stack(cin);
    cout<<result;
    return 0;
}

double manage_stack(istream& insert){
    double number;
    char symbol;
    Stack<double> numbers;
    Stack<char> symbols;
    while(insert.peek()!='\n'){
    if(isdigit(insert.peek())||insert.peek()=='.'){
        insert>>number;
        numbers.push(number);
    }
    else if(strchr("+-*/",insert.peek())!=NULL){
        insert>>symbol;
        symbols.push(symbol);
    }
    else if(insert.peek()==')')
        evaluate(numbers, symbols);
    else
        insert.ignore();
    }
    return numbers.top();
}

void evaluate(Stack<double> numbers, Stack<char> operations){
    double n1, n2;
    n2=numbers.top();
    numbers.pop();
    n1=numbers.top();
    numbers.pop();
    switch(operations.top()){
    case'+':numbers.push(n1+n2);
            break;
    case'-':numbers.push(n1-n2);
            break;
    case'*':numbers.push(n1*n2);
            break;
    case'/':numbers.push(n1/n2);
            break;
    }
    operations.pop();
}

任何人都可以帮助我吗?提前谢谢!

1 个答案:

答案 0 :(得分:3)

Item data[];是非标准扩展程序,使用不当。请参阅this answer以了解它应该如何使用。你还没有为它分配任何内存,因为你在undefined behavior。您的程序可以有任何行为,包括运行和返回随机值。对于您的应用,您应该考虑使用std::stack而不是Stack类。看起来你可以直接替换它。

#include <stack>
template<class T>
using Stack = std::stack<T>;

我试图运行您的示例,但结果仍然不正确,但它不会返回随机值。它总是返回第一个操作数两次。

我已经回答了为什么结果看起来是随机的。如果你想知道为什么你的解析器仍然没有给出正确的结果,我建议使用调试器。还有很多工作要做。例如,似乎没有对输入进行任何迭代。你需要某种循环或递归。