Anonymous
Anonymous asked in 電腦與網際網路程式設計 · 1 decade ago

中序轉後序程式碼C++

裡面兩個function 是課本的

教授說 = = 叫我們定義裡面的變數 然後輸入 A+B+C+D 會print後敘式出來

可是我自己試過很多次 都不知哪裡出問題

precedence 這要定義嗎??

程式碼:

#include<stdio.h>

#include<stdlib.h>

int eval(void)

{

precedence token;

char symbol;

int op1,op2;

int n=0;

int top=-1;

token=gettoken(&symbol,&n);

while(token!=eos){

if(token==operand)

push(symbol-'0');

else

op2=pop();

OP1=pop();

switch(token){

case plus:push(op1+op2);

break;

case minus:push(op1-op2);

break;

case times:push(op1*op2);

break;

case divide:push(op1/op2);

break;

case mod:push(op1%op2);

break;

}

}

token=gettoken(&symbol,&n);

}

return pop();

}

precedence gettoken(char *symbol,int *n)

*symbol=exper[(*n)++];

switch(*symbol){

case '(':return lparen;

case ')':return rparen;

case '+':return plus;

case '-':return minus;

case '/':return divide;

case '*':return times;

case '%':return mod;

case ' ':return eos;

default :return operand;

}

}

int main(void)

{

system("pause");

return 0;

}

/* 主程式可以寫給我看看嗎@@ ? 謝謝大大

Update:

&quot 是 "

&#039 是 ’

& 是 &

Update 2:

???大大:原來課本還有多一個函式

void postfix(void)

char symbol;

int n=0;

int top=0;

stack[0]=eos;

for(token=gettoken(&symbol,&n);token!=eos;

token=gettoken(&symbol,&n)){

if (token==operand)

printf("%c",symbol);

Update 3:

else if(token==rparen){

while(stack[top]!=lparen)

printToken(pop());

pop();

}

else{

while(isp[stack[top]]>=icp[token])

printToken(pop());

push(token);

}

}

Update 4:

while((token=pop())!=eos)

printToken(token);

printf("\n");

}

Update 5:

//*token 要怎定義呢@@?

printToken 又是!??

Update 6:

拜託你了><""

謝謝!!若是不夠回答我在開一個

1 Answer

Rating
  • re
    Lv 4
    1 decade ago
    Favorite Answer

    precedence當然要定義

    不然不知道他是什麼

    不過你的程式碼似乎大括號數量或是位置有誤....

    2009-11-10 23:09:29 補充:

    而且eval比較像是已經轉成後序式後

    由後序式計算出結果

    而不是用來中序轉後序的

    2009-11-10 23:35:00 補充:

    雖然不是你題目要的

    但我已經把你程式碼改到能跑了

    不過你的程式碼的功能真的是"計算後序式的結果"

    而不是你要的"中序改為後序"

    #include<stdio.h>

    #include<stdlib.h>

    #include<string.h>

    char exper[100]; /*存放後序式字串*/

    typedef enum{plus,minus,times,divide,mod,eos,operand} precedence;

    int Stack[100];

    int Stack_N=0;

    void push(int n)

    {

    if(Stack_N==100)

    return;

    Stack[Stack_N++]=n;

    }

    int pop()

    {

    if(Stack_N==0)

    return -1;

    return Stack[--Stack_N];

    }

    int eval(void)

    {

    precedence token;

    char symbol;

    int op1,op2;

    int n=0;

    int top=-1;

    token=gettoken(&symbol,&n);

    while(token!=eos)

    {

    if(token==operand)

    push(symbol-'0'); //這樣寫會限制數值只能是一位數,可再修改

    else

    {

    op2=pop();

    op1=pop();

    switch(token)

    {

    case plus:

    push(op1+op2);

    break;

    case minus:

    push(op1-op2);

    break;

    case times:

    push(op1*op2);

    break;

    case divide:

    push(op1/op2);

    break;

    case mod:

    push(op1%op2);

    break;

    }

    }

    token=gettoken(&symbol,&n);

    }

    return pop();

    }

    int gettoken(char *symbol,int *n)

    {

    *symbol=exper[(*n)++];

    switch(*symbol)

    {

    //後序式中不會有括號

    /*case '(':

    return lparen;

    case ')':

    return rparen;*/

    case '+':

    return plus;

    case '-':

    return minus;

    case '/':

    return divide;

    case '*':

    return times;

    case '%':

    return mod;

    case '\0':

    return eos;

    default :

    return operand;

    }

    }

    int main(void)

    {

    strcpy(exper,"12+345*+*"); // (1+2)*(3+4*5) 的後序式

    printf("%d",eval());

    system("pause");

    return 0;

    }

Still have questions? Get your answers by asking now.