您好我试图用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();
}
任何人都可以帮助我吗?提前谢谢!
答案 0 :(得分:3)
Item data[];
是非标准扩展程序,使用不当。请参阅this answer以了解它应该如何使用。你还没有为它分配任何内存,因为你在undefined behavior。您的程序可以有任何行为,包括运行和返回随机值。对于您的应用,您应该考虑使用std::stack而不是Stack
类。看起来你可以直接替换它。
#include <stack>
template<class T>
using Stack = std::stack<T>;
我试图运行您的示例,但结果仍然不正确,但它不会返回随机值。它总是返回第一个操作数两次。
我已经回答了为什么结果看起来是随机的。如果你想知道为什么你的解析器仍然没有给出正确的结果,我建议使用调试器。还有很多工作要做。例如,似乎没有对输入进行任何迭代。你需要某种循环或递归。