2

講師から、Stackを使用して中置式を後置に変換するプログラムを作成するという課題がありました。中置式を読み取るためのスタッククラスといくつかの関数を作成しました。

しかし、この1つの関数はinToPos(char string [])と呼ばれ、スタックを使用して文字列inFixのinFix式を文字列postFixのpostfix式に変換します。皆さんは私を助けて、私が間違っていることを教えてもらえますか?

これらはあなたの助けをひどく必要とする私のコードです..:)

#include<stdio.h>
#include<stdlib.h>
#define MAX 15
#define true 1 
#define false 0 

typedef struct node* nodeptr;

typedef struct node{
    int data;
    nodeptr next;
}Node;

typedef struct{
    int count;
    nodeptr top;
}Stack;
typedef Stack* StackList;

StackList create();
void display(StackList list);
int isEmpty(StackList list);
void push(StackList list, int item);
void pop(StackList list);

int inToPos(char string[]);
int isOperator(char string[], int i);
int precedence(char x);

StackList create(){
StackList list;
list=(StackList)malloc(sizeof(Stack));
list->count=0;
list->top=NULL;
return list;
}

void display(StackList list){
    nodeptr ptr;
    ptr=list->top;
    while(ptr!=NULL){
        printf("%d ",ptr->data);
        ptr=ptr->next;
    }
    printf("\n");
}

int isEmpty(StackList list){
    return list->count==0;
    //return list->top==NULL;
}

void push(StackList list, int item){
    nodeptr temp;
    temp=(nodeptr)malloc(sizeof(Node));
    temp->data=item;
    temp->next=list->top;
    list->top=temp;
    (list->count)++;
}

void pop(StackList list){
    nodeptr temp;
    temp=list->top;
    list->top=temp->next;
    temp->next=NULL;
    free(temp);
    (list->count)--;
}

int inToPos(char string[]){
    int i,a=0;
    char postfix[MAX];
    StackList list=create();
    for(i=0;string[i]!='\0';i++){
        if(!isOperator(string,i)){
            postfix[a]=string[i];
            a++;
        }
        else if(isEmpty(list))
            push(list,string[i]);
        else{
            if(precedence(string[i])>precedence(list->top->data))
                push(list,string[i]);
            else{
                postfix[a]=list->top->data;
                a++;
                pop(list);
                if(!isEmpty(list)){
                    while(precedence(list->top->data)<=precedence(string[i])){
                        postfix[a]=list->top->data;
                        a++;
                        pop(list);
                    }
                }
                else
                    push(list,string[i]);
            }
        }
    }
    puts(postfix);
}


int isOperator(char string[], int i){
    switch(string[i])
    {
    case '+':
    case '-':
    case '*':
    case '%':
    case '/': return true;

    default: return false;
    }
}

int precedence(char x){
    switch(x)
    {
    case '%':
    case '*':
    case '/': return 2;
    case '+':
    case '-': return 1;

    default: return 0;
    }
}
int main(void){

    char string[MAX]="a+b*c-d";
    inToPos(string);
}

関数inToPosは、次のアルゴリズムを使用して作成されていることに注意してください。

  • 中置文字列を左から右にスキャンします。
  • 空のスタックを初期化します。
  • スキャンした文字がオペランドの場合は、Postfix文字列に追加します。スキャンした文字が演算子で、スタックが空の場合文字をスタックにプッシュします。
  • スキャンされた文字が演算子であり、スタックが空でない場合は、文字の優先順位をスタックの最上位の要素(topStack)と比較します。topStackがスキャンされた文字よりも優先される場合は、スタックをポップします。それ以外の場合は、スキャンされた文字をスタックにプッシュします。スタックが空でなく、topStackが文字よりも優先される限り、この手順を繰り返します。文字がスキャンされるまで、この手順を繰り返します。
  • (すべての文字がスキャンされたら、スタックに必要な文字をPostfix文字列に追加する必要があります。)スタックが空でない場合は、topStackをPostfix文字列に追加してスタックをポップします。スタックが空でない限り、この手順を繰り返します。
  • 接尾辞の文字列を返します。
4

2 に答える 2

2

あなたは本当にデバッガーの使い方を学ぶべきです、それはこれらのような問題を理解するための素晴らしいツールです。しかし、私はそれを実行し、あなたの問題を理解しました:

この行で:

while(precedence(list->top->data)<=precedence(string[i])){

リストを反復処理するときは、ループに入る前だけでなく、毎回スタックが空かどうかを確認する必要があります。だから、このようなことをしてください:

while(!isEmpty(list) && precedence(list->top->data)<=precedence(string[i])){

代わりは。

于 2013-03-11T01:50:51.533 に答える
0
[Program to convert infix to postfix using stack][1]

C program to convert infix to postfix using stackC

#define SIZE 50            
#include <ctype.h>
char s[SIZE];
int top=-1;       /* Global declarations */

push(char elem)
{                       /* Function for PUSH operation */
    s[++top]=elem;
}

char pop()
{                      /* Function for POP operation */
    return(s[top--]);
}

int pr(char elem)
{                 /* Function for precedence */
    switch(elem)
    {
    case '#': return 0;
    case '(': return 1;
    case '+':
    case '-': return 2;
    case '*':
    case '/': return 3;
    }
}

main()
{                         /* Main Program */
    char infix[50],postfix[50],ch,elem;
    int i=0,k=0;
    printf("\n\nEnter Infix Expression : ");
    scanf("%s",infix);
    push('#');
    while( (ch=infix[i++]) != '\0')
    {
        if( ch == '(') push(ch);
        else
            if(isalnum(ch)) postfix[k++]=ch;
            else
                if( ch == ')')
                {
                    while( s[top] != '(')
                        postfix[k++]=pop();
                    elem=pop(); /* Remove ( */
                }
                else
                {       /* Operator */
                    while( pr(s[top]) >= pr(ch) )
                        postfix[k++]=pop();
                    push(ch);
                }
    }
    while( s[top] != '#')     /* Pop from stack till empty */
        postfix[k++]=pop();
    postfix[k]='\0';          /* Make postfix as valid string */
    printf("\nPostfix Expression =  %s\n",postfix);
}
于 2018-10-05T06:59:21.290 に答える