2017-01-09 72 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評論中延長問答時間並不是學習編程的最佳方式。 –