2017-01-09 71 views
0

您好我试图编写一个程序在C++中使用堆栈评估表达式,但结果是一个随机数(地址内存可能,但它不是一个指针)。 这里的堆栈template`评估与堆栈的表达式

#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_ */ 
` 

,这主要是与使用

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

谁能帮我2层的功能呢?提前致谢!

+0

考虑'used'是指:堆栈顶部的元素,还是刚刚超过顶部的元素。 – 1201ProgramAlarm

+0

没有看到存储被分配给'data'的任何迹象 – user4581301

+0

'Item data [];'这不是合法的C++,当然也不是无限数组。 –

回答

3

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

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

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

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

+0

我已经纠正了堆栈的容量并添加了循环,但仍然无法正常工作。我用新代码编辑 – Xdroid

+1

@Xdroid如果用户不使用括号,则永远不要在'manage_stack'中调用'evaluate'。只要数字堆栈在'manage_stack'结尾处包含多于一个数字,就应该在堆栈上调用评估。原来的问题已经回答。如果您有*新问题,请使用调试器,并针对您无法解决的问题创建新问题,并且您无法找到现有资源**。在stackoverflow评论中延长问答时间并不是学习编程的最佳方式。 –