中缀到Postfix转换 - 分段错误

时间:2013-01-06 09:28:34

标签: c++ segmentation-fault stack

我遇到一个分段错误,说核心被丢弃了。 C ++程序是隐藏中缀表达式。我猜逻辑是正确的。我检查了代码,但无法弄清楚错误。 我有优先级函数来计算运算符的优先级,函数ifpf将中缀表达式转换为后缀表达式。

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#define size 100
using namespace std;
class stack{
    char pstack[size];
    int top;
    public:
    stack(){
        int top=-1;
    }
    void push(char item){
        if(top==size) {cout<<"Stack is already full";exit(0);}
        else {pstack[++top]=item;}
    }
    char pop(){
        char ch='#';
        if(top==-1) cout<<"Stack is empty...";
        else { ch=pstack[top--];}
        return ch;
    }
    int precedence(char ch){
        switch(ch){
            case '(' : return 1;
            case ')' : return 2;
            case '+' :
            case '-' : return 3;
            case '*' :
            case '/' :
            case '%' : return 4;
            case '^' : return 5;
            default : return 0;
        }
    }
    void ifpf(){
        int len,priority,i,j=0;
        char infix[size],ch,postfix[size];
        cout<<"Enter the infix expression : "<<endl;
        cin>>infix;
        len=strlen(infix);
        infix[len++]=')';
        push('(');
        for(i=0,j=0;i<len;i++){
            switch(precedence(infix[i])){
                case 1 : push(infix[i]);break;
                case 2 : ch=pop();
                while(ch!='('){
                    postfix[j++]=ch;ch=pop();
                }
                break;
                case 3 : ch=pop();
                while(precedence(ch)>=3){
                    postfix[j++]=ch;ch=pop();
                }
                push(ch);
                push(infix[i]);
                break;
                case 4 : ch=pop();
                while(precedence(ch)>=4){
                    postfix[j++]=ch;ch=pop();
                }
                push(ch);
                push(infix[i]);
                break;
                case 5 : ch=pop();
                while(precedence(ch)==5){
                    postfix[j++]=ch;ch=pop();
                }
                push(ch);
                push(infix[i]);
                break;
                default : postfix[j++]=infix[i];break;
            }
        }
        cout<<"The post fix wxpression is : ";
        cout<<postfix;
    }
};
int main(){
    stack obj;
    obj.ifpf();
    return 0;
}

2 个答案:

答案 0 :(得分:0)

这是第一个错误:

if(top==size) {cout<<"Stack is already full";exit(0);}
else {pstack[++top]=item;}

应该是:

if(top==size-1) {cout<<"Stack is already full";exit(0);}
else {pstack[++top]=item;}

答案 1 :(得分:0)

问题是您没有正确设置top,在您的构造函数中,您声明了一个本地top,其中 stack :: top未初始化

 stack(){
        int top=-1;  //
    }

更新到以下代码,应该可以工作:

   stack() {
        top = -1;
    }