鍍金池/ 問答/C++  HTML/ C++創(chuàng)建鏈棧模板并由此設(shè)計一個簡單計算器,出現(xiàn)下面兩個編譯錯誤請問怎么解決?

C++創(chuàng)建鏈棧模板并由此設(shè)計一個簡單計算器,出現(xiàn)下面兩個編譯錯誤請問怎么解決?

  1. 編寫了鏈棧的類模板,保存為 標(biāo)頭.h 文件,并基于此設(shè)計了一個簡單加減乘除計算器。在編譯過程中,出現(xiàn)了下面錯誤,不知如何解決,求大神指導(dǎo)~

“ 標(biāo)頭.h ” 文件如下:

 //鏈棧的類模板
#include<cassert>
using namespace std;
template<typename T>class Stack;
template<typename T>class Node{ //鏈棧結(jié)點類模板
    T info;
    Node<T>*link;
public:
    Node(T date = 0, Node<T>*next = NULL) {
        info=data; //編譯錯誤C2563: 在形參表中不匹配
        link=next; //編譯錯誤C2568: “=”無法解析函數(shù)重構(gòu)
    }
    friend class Stack<T>;
};
template<typename T>class Stack{ //鏈棧類模板,無頭結(jié)點鏈表
    Node<T>*top; //棧頂指針
public: 
    Stack() { top = NULL; }
    ~Stack();
    void Push(const T &data); //壓棧
    T Pop(); //彈出
    T GetTop();  //取棧頂元素
    void MakeEmpty(); //清空棧
    bool IsEmpty(){ return top == NULL; }
};
template<typename T>Stack<T>::~Stack() { MakeEmpty(); }
template<typename T>void Stack<T>::MakeEmpty() {
    Node<T>*temp;
    while (top != NULL) { temp = top; top = top->link; delete temp; }

}
template<typename T>void Stack<T>::Push(const T &data) {
    top = new Node<T>(data, top);
}
template<typename T>T Stack<T>::Pop() {
    assert(!IsEmpty());
    Node<T>*temp = top;
    T data = temp->info;
    top = top->link; //丟棄棧頂結(jié)點
    delete temp; //釋放棧頂結(jié)點
    return data; //返回棧頂數(shù)據(jù)
} 
template<typename T>T Stack<T>::GetTop() {
    assert(!IsEmpty());
    return top->info;
}

.cpp文件如下:

#include<iostream>
#include<cmath>
#include<cstdlib>
#include"標(biāo)頭.h" 
using namespace std;
class Calculator { //計算器類
    Stack<int>Nstack;
    Stack<char>Ostack;
public:
    Calculator(void) { };
    void Cal(void);
    void GetTwoNum(int &Num1, int &Num2);
    void Compute(char Opr);
    void Clear(void);
};
void Calculator::Clear() {
    Nstack.MakeEmpty();
    Ostack.MakeEmpty();
}
void Calculator::GetTwoNum(int &Num1, int &Num2) {
    Num1 = Nstack.Pop();
    Num2 = Nstack.Pop();
}
void Calculator::Compute(char Opr) {
    int Num1, Num2;
    if (Opr != '=')GetTwoNum(Num1, Num2);
    switch (Opr) {
    case '+':Nstack.Push(Num2 + Num1); break; //結(jié)果壓棧
    case '-':Nstack.Push(Num2 - Num1); break;
    case '*':Nstack.Push(Num2 * Num1); break;
    case '/':Nstack.Push(Num2 / Num1); break;
    case '=':cout << Nstack.Pop() << endl;
    }
}
void Calculator::Cal() { //讀取用戶輸入(數(shù)字字符or操作字符)
    bool b1 = true,b2 = true;
    char ch1, ch2, str[50]; //ch1存新獲取的字符,ch2存從棧中取出的字符
    int k = -1;
    while (b2) {
        cin >> ch1;
        if (ch1 >= '0'&&ch1 <= '9') {
            k++;
            str[k] = ch1;//數(shù)字字符加入串中
        }
        else {
            if (k >= 0) {
                str[k + 1] = '\0';
                Nstack.Push(atoi(str)); //數(shù)字字符加入數(shù)組棧中
                k = -1;
            }
            switch (ch1) {
            case'c':
                Clear();
                break;
            case'+':  
            case'-':                             //+ - 優(yōu)先級最低,輸入新的= —號時,可直接彈出此時棧頂操作符進(jìn)行計算,并把結(jié)果壓棧
                while (!Ostack.IsEmpty()) {
                    ch2 = Ostack.Pop();

                    Compute(ch2);
                }
                Ostack.Push(ch1);
                break;
            case'*':
            case'/':
                while (!Ostack.IsEmpty() && b1) {
                    ch2 = Ostack.Pop();    //棧頂運算符出棧
                    if (ch2 == '*' || ch2 == '/') //比較優(yōu)先級
                        Compute(ch2); //同是 * / 優(yōu)先級不高,先計算原來棧中已有的* or / 運算符
                    else {
                        Ostack.Push(ch2); //新的優(yōu)先級高 ,先把原棧中運算符壓回去
                        b1 = false;
                    }
                }
                Ostack.Push(ch1); //再把新運算符壓棧
                b1 = true;
                break;
            case'=':
                while (!Ostack.IsEmpty()) {
                    ch2 = Ostack.Pop();
                    Compute(ch2);
                }
                Compute(ch1);
                break;
            }
                    if (ch1 == 'z') b2 = false;
        }
            
    
    }
}
int main(){
    Calculator Calcul;
    cout << "請輸入四則運算式:" << endl;
    Calcul.Cal();
    getchar();
    return 0;
}


編譯錯誤圖片:
![圖片描述][1]


  [1]: /img/bVbaCGz
回答
編輯回答
卟乖

it's my typo: data->date
Thanks for Chen's answer

2017年10月1日 13:52