以下程序将中缀表达式转换为后缀不会产生正确的结果?

时间:2015-07-13 04:09:51

标签: c++ stack

以下程序用于将中缀表达式转换为postfix,但它产生输入字符串作为输出,即程序没有给出后缀表达式作为输出。 请解释代码有什么问题。

#include<iostream.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct stack{
    int top;
    unsigned capacity;
    char *arr;
};

void push(struct stack * stk,char data){
    if(stk->top != stk->capacity-1) 
        stk->arr[++stk->top]=data;
}

char pop(struct stack* stk){
    if(stk->top!= -1){
        char c = stk->arr[stk->top];
        stk->top--;
        return c;
    }
}
int priority(char c){
    switch(c){
    case '+': return 1;
    case '-': return 1;
    case '*': return 2;
    case '/': return 2;
    case '^': return 3;
    }
}

void intopostfix(char * ch){
    struct stack *stk = (struct stack*)malloc(sizeof(struct stack));
    stk->top=-1;
    stk->capacity = strlen(ch);  
    if(!stk){cout<<"stack not created";}
    int i,k;
    for(i=0,k=-1; ch[i] ; ++i){
        if((ch[i]>='a' && ch[i]<='z')||(ch[i]>='A' && ch[i]<='Z') ){
            ch[++k]=ch[i];
        }
        else if(ch[i]=='('){
            push(stk,ch[i]);
        }
        else if(ch[i]==')'){
            while((stk->top!=-1)&& (ch[i]!='('))
            {
                ch[++k]=pop(stk);
                //k++;
            }
        }
        else{
            while((stk->top!=-1)&&(priority(ch[i])<=priority(stk->arr[stk->top]))){
                ch[++k]=pop(stk);

            }
            push(stk,ch[i]);
        }
        while(stk->top!=-1){
            ch[++k]=pop(stk);

            //k++;
        }

    }
       for(i=0;ch[i]!='\0';i++)
       cout<<ch[i];

}
int main(){
    clrscr();
    char exp[]="a+b*(c^d-e)^(f+g*h)-i";
    intopostfix(exp);
    getch();
    return 0;
}

程序输出与输出相同的字符串即      A + B *(C ^ d-e)中^(F + G * H)-i

1 个答案:

答案 0 :(得分:0)

需要进行以下更改

  1. 最后一个while语句需要移出for循环。这需要在处理所有令牌后完成。请参阅此处的算法http://interactivepython.org/runestone/static/pythonds/BasicDS/InfixPrefixandPostfixExpressions.html

    1. 输出应写入单独的变量

    2. 需要在switch语句

    3. 中添加默认情况

      默认:返回0;

      1. 内存需要分配到堆栈
      2. stk-&gt; arr =(char *)malloc(500);

        还需要进行其他细微更改。

        以下是代码的修改部分

        int priority(char c){
            switch(c){
            case '+': return 1;
            case '-': return 1;
            case '*': return 2;
            case '/': return 2;
            case '^': return 3;
            default : return 0;
            }
        }
        
        
        void intopostfix(char * ch){
            struct stack *stk = (struct stack*)malloc(sizeof(struct stack));
        //struct stack *stk = (struct stack*)malloc(500);
            stk->arr = (char *)malloc(500);
            stk->top=-1;
            stk->capacity = strlen(ch);
            char postFixStr [500];
            if(!stk){cout<<"stack not created";}
            int i,k;
            for(i=0,k=-1; ch[i] ; ++i){
                if((ch[i]>='a' && ch[i]<='z')||(ch[i]>='A' && ch[i]<='Z') ){
                    postFixStr[++k]=ch[i];
                }
                else if(ch[i]=='('){
                    push(stk,ch[i]);
                }
                else if(ch[i]==')'){
                    while((stk->top != -1)&& (stk->arr[stk->top] != '('))
                    {
                        postFixStr[++k]=pop(stk);
                        //k++;
                    }
                    pop(stk);
                }
                else{
                    while((stk->top!=-1)&&(priority(ch[i])<=priority(stk->arr[stk->top]))){
                        postFixStr[++k]=pop(stk);
        
                    }
                    push(stk,ch[i]);
                }
            }
            while(stk->top!=-1){
                  postFixStr[++k]=pop(stk);
        
                  //k++;
            }
        
              postFixStr[++k] = '\0';
        
               //for(i=0;ch[i]!='\0';i++)
               //cout<<ch[i];
               cout<<postFixStr << endl;
        
        }