none
求帮助,出栈时 出错 哪里有问题啊 RRS feed

  • 问题

  • #include <iostream>

    #include <fstream> 

    #include <string>

    #include <cstdlib>      // for exit()

    #include <cctype>       // for is...()

    using namespace std;

    enum TknKind {                           

        Print, Lparen, Rparen, Plus, Minus, Multi, Divi,

        Assign, VarName, IntNum, EofTkn, Others

    };

    struct Token {

        TknKind kind;                         

        int  intVal;                        

    string text;

        Token ()           { kind = Others; intVal = 0; text="";}

        Token (TknKind k, int d=0, string s = "") { kind = k; intVal = d; text = s;}

    };

    void input();

    void statement();

    void expression();

    void term();

    void factor();

    Token nextTkn();

    int nextCh();

    void operate(TknKind op);

    void push(int n);

    int pop();

    void chkTkn(TknKind kd);

    void varpush(string text);

    string varpop();

    #define STK_SIZ 50                        

    int stack[STK_SIZ+1];                  

    string stackkey[STK_SIZ+1];

    int stkct;                           

    Token token;                            

    char buf[80], *bufp;                     

    int ch;                              

    int var[80];                   

    string varkey[80];

    int errF; 

    int temp=0;

    int main()

    {

        while (1) {

            input();                         

            token = nextTkn();          

            if (token.kind == EofTkn) 

    exit(1); 

            

    statement();                   

            if (errF) 

    cout << "  --err--\n";

        }

        return 0;

    }

    void input()

    {

        errF = 0; stkct = 0;                  

        cin.getline(buf, 80);             

        bufp = buf;                      

        ch = nextCh();             

    }

    void statement()        

    {

        int vNbr;

    int vaNbr;

        switch (token.kind) {

        case VarName:      

    vNbr = ++temp;     

    vaNbr = token.intVal;

            token = nextTkn();

            chkTkn(Assign); if (errF) break;  

            token = nextTkn();

            expression();      

            varkey[vNbr] = varpop();     

    var[vaNbr] = pop();

            break;

        case Print:             

            token = nextTkn();

            expression();

            chkTkn(EofTkn); if (errF) break;

            cout << "  " << pop() << endl;

            return;

        default:

            errF = 1;

        }

        chkTkn(EofTkn);      

    }

    void expression()       

    {

        TknKind op;

        term();

        while (token.kind==Plus || token.kind==Minus) {

            op = token.kind;

            token = nextTkn(); term(); operate(op);

        }

    }

    void term()         

    {

        TknKind op;

        factor();

        while (token.kind==Multi || token.kind==Divi) {

            op = token.kind;

            token = nextTkn(); factor(); operate(op);

        }

    }

    void factor()           

    {

        switch (token.kind) {

        case VarName:            

    varpush(token.text);

    temp++;

            break;

        case IntNum:             

    push(token.intVal);

            break;

        case Lparen:                   

            token = nextTkn();

            expression();

            chkTkn(Rparen);             

            break;

        default:

            errF = 1;

        }

        token = nextTkn();

    }

    Token nextTkn()                  

    {

    TknKind kd=Others;

        int  num ;

        while (isspace(ch))            

           {

      ch = nextCh();

    }

    if (isdigit(ch)) 

    {                

    for (num=0; isdigit(ch); ch=nextCh())

    {

                 num = num*10 + (ch-'0');

            }

            return Token(IntNum, num);

        }

    else if (islower(ch))

    {        

    string text;

    for (num=0 ; islower(ch)||isupper(ch); ch=nextCh())

    {

                text += ch;

            }

            return Token(VarName, num,text);

        }

    else if (isupper(ch)) 

    {           

    string text;

    for (num=0 ; islower(ch)||isupper(ch); ch=nextCh())

    {

                text += ch;

            }

            return Token(VarName, num,text);

    }

        else 

    {

            switch (ch)

    {

            case '(':  kd = Lparen; break;

            case ')':  kd = Rparen; break;

            case '+':  kd = Plus;   break;

            case '-':  kd = Minus;  break;

            case '*':  kd = Multi;  break;

            case '/':  kd = Divi;   break;

            case '=':  kd = Assign; break;

            case '?':  kd = Print;  break;

            case '\0': kd = EofTkn; break;

            }

            ch = nextCh();

            return Token(kd);

        }

    }

    int nextCh()                         

    {

        if (*bufp == '\0') 

    return '\0'; 

    else 

    return *bufp++;

    }

    void operate(TknKind op)               

    {

        int d2 = pop(), d1 = pop();

        if (op==Divi && d2==0) 

    cout << "  division by 0\n"; errF = 1;

    }

        if (errF) return;

        switch (op) 

    {

        case Plus:  push(d1+d2); break;

        case Minus: push(d1-d2); break;

        case Multi: push(d1*d2); break;

        case Divi:  push(d1/d2); break;

        }

    }

    void push(int n)                       

    {

        if (errF) return;

        if (stkct+1 > STK_SIZ) 

    cout << "stack overflow\n"; exit(1);

    }

        

    stack[++stkct] = n;

    }

    int pop()                           

    {

        if (errF) return 1;               

        if (stkct < 1) 

    cout << "stack underflow\n"; exit(1); 

    }

        return stack[stkct--];

    }

    void varpush(string text)             

    {

        if (errF) return;

        if (temp+1 > STK_SIZ)

    cout << "stack overflow\n"; exit(1);

    }

        

    varkey[++temp] = text;

    }

    string varpop()

    {

        if (errF) return "1";     

        if (temp < 1) 

    cout << "stack underflow\n"; exit(1); 

    }

        return varkey[temp--];

    }

    void chkTkn(TknKind kd)

    {

    if (token.kind !=kd)errF=1;

    }

    2014年5月27日 12:25

答案

  • 你好,

    能否把你的代码添加一些注释,看你的出栈进栈代码似乎没什么问题。你的输入要求是怎样的?你自己调试的问题在哪里?给出你的代码解释会帮助我们了解你的用意,从而找出问题。这个链接也许对你有帮助。

    http://www.codeproject.com/Questions/614722/Evaluating-a-postfix-expression-in-cplusplus


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年5月30日 2:52