-5

core dumped というセグメンテーション違反が発生しています。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;
}
4

2 に答える 2

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;}
于 2013-01-06T09:40:29.067 に答える
0

問題はtop、適切に設定していないことです。コンストラクターで、ローカルtopを宣言し、 stack::top uninitializedのままにしました。

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

以下のコードに更新すると、動作するはずです。

   stack() {
        top = -1;
    }
于 2013-01-06T10:41:17.367 に答える