繁体   English   中英

中缀到前缀和后缀的转换

[英]Infix to Prefix and Postfix conversion

我正在编写代码以同时将中缀表达式转换为后缀和前缀。

我的问题是我无法转换为前缀表达式。 在我的 intoprefix() 中,我尝试了所有方法,但 output 仍然与后缀相同。

如果我在哪里输入这个表达式

A+B

预期的 output 将是

Postfix expression is: AB+
Prefix expression is: +AB 

但我的 output 是

Postfix expression is: AB+
Prefix expression is: AB+AB+

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Stack{
char data;
struct Stack *next;
}*top = NULL, *pstart = NULL;

char str[50];

int main(int argc, char **argv){
printf("Enter infix expression: ");
gets(str);

printf("\n\nEquivalent postfix expression is: ");
intopostfix(str);

printf("\n\nEquivalent prefix expression is: ");
intoprefix(str);
printf("\n");
return 0;
}

/* function for insert operation */
void insert(char ch){

    struct Stack *ptr,*newNode;
    newNode = (struct Stack *)malloc(sizeof(struct Stack));
    newNode->next = NULL;
    newNode->data = ch;
    ptr = pstart;

    if(pstart == NULL){
    pstart = newNode;
    }
    else{
    while(ptr->next != NULL)
    ptr = ptr->next;
    ptr->next = newNode;
    }

}

/* function for push operation */
void push(char symbol){

    struct Stack *ptr;

        ptr = (struct Stack *)malloc(sizeof(struct Stack));
        ptr->data = symbol;

        if(top == NULL){
            top = ptr;
            ptr->next = NULL;
        }
        else{
            ptr->next = top;
            top = ptr;
    }
}

char pop(){

    struct Stack *ptr1;
    char ch1;

        if(top == NULL){
        printf("Stack underflow\n");
        return 0;
        }
        else{
            ptr1 = top;
            top = top->next;
            ch1 = ptr1->data;
            free(ptr1);
            ptr1 = NULL;
            return ch1;
        }
}

/* function for display display operation */
void displaypost(){

    struct Stack *temp;

        if(pstart == NULL)
            printf("");
        else{           
            temp = pstart;
        while(temp != NULL){
        printf("%c",temp->data);
        temp = temp->next;
        }
    }
}

/*function for precedence */
int precedence(char ch){

        if(ch   ==  '^'){
        return (5);
        }
        else if(ch == '*' || ch == '/'){
        return (4);
        }
        else if(ch == '+' || ch == '-'){
        return (3);
        }
        else{
        return (2);
        }
}
 /*function for converting infix to postfix */
void intopostfix(char str[]){

    int length;
    int index = 0;
    char symbol, temp;
    length = strlen(str);

    while(length > index)
    {
        symbol = str[index];

        switch(symbol){

        case '(':
        push(symbol);
        break;

        case ')':
        temp = pop();

        while(temp != '('){
        insert(temp);
        temp = pop();
        }

        break;

        case '^':
        case '+':
        case '-':
        case '*':
        case '/':

        if(top == NULL){
            push(symbol);
        }
        else{
        while(top != NULL && (precedence(top->data) >= precedence(symbol))){
            temp = pop();
            insert(temp);
            }
            push(symbol);
        }   
            break;
            default:
            insert(symbol);
         }
         index = index + 1;
    }
        while(top != NULL){
        temp = pop();
        insert(temp);
    }

        displaypost();
        return;
}
/*function to convert infix to prefix */
void intoprefix(char str[]){

    int length;
    int index = 0;
    char symbol, temp;
    length = strlen(str);

    while(length > index)
    {
        symbol = str[index];

        switch(symbol){

        case ')':
        temp = pop();
        break;

        case '(':
        push(symbol);


        while(temp != ')'){
        insert(temp);
        temp = pop();
        }

        break;

        case '+':
        case '-':
        case '*':
        case '/':
        case '^':

        if(top == NULL){
            push(symbol);
        }
        else{
        while(top != NULL && (precedence(top->data) <= precedence(symbol))){
            temp = pop();
            insert(temp);
            }
            push(symbol);
        }   
            break;
            default:
            insert(symbol);
         }
         index = index + 1;
    }
        while(top != NULL){
        temp = pop();
        insert(temp);
    }

        displaypost();
        return;
}

该程序使用链表(堆栈)将中缀转换为后缀和前缀

以下是我的观察和修正:

  1. 收到有关gets的警告。 已使用fgets代替。 gets是危险的,因为它可能导致缓冲区溢出。
  2. 释放在insert function 中分配的存储空间。当调用intoprefix时,这些位置的存在导致结果重复。
  3. 由于您已经有一个intopostfix function,因此我使用以下算法将中infix转换为prefix 参考

    步骤 1:反转中缀表达式。 请注意,在反转每个 '(' 将变为 ')' 并且每个 ')' 变为 '('。

    第二步:获取修改后的表达式的后缀表达式。

    第三步:反转后缀表达式。

  4. main是存储输入和结果的 arrays 的所有者,从而避免使用“全局变量”并要求我显式传递这些变量。

  5. displaypost中删除了显示柱intopostfix并从main调用它。

     void insert(char ch);//no changes made void push(char symbol); //no changes made char pop(); //no changes made void displaypost(char * s); int precedence(char ch); //no changes made void intopostfix(char str[]); //removed the call to displaypost int main(int argc, char **argv){ char str[50]; char prefix_str[50];//store postfix str char postfix_str[50];//store prefix str printf("Enter infix expression: "); fgets(str,50,stdin); str[strlen(str)-1] = '\0';//overwrite newline char with NULL //reverse the original string and store in prefix_str int i,j; for(i = strlen(str)-1,j = 0;i >= 0;i--,j++){ if(str[i] == '(') prefix_str[j] = ')'; else if(str[i] == ')') prefix_str[j] = '('; else prefix_str[j] = str[i]; } prefix_str[j] = '\0'; //Print Post Fix printf("\n\nEquivalent postfix expression is: "); intopostfix(str); displaypost(postfix_str); printf("%s",postfix_str); //Print Prefix intopostfix(prefix_str); displaypost(prefix_str); //reverse prefix_str int temp; for(i = 0,j = strlen(prefix_str)-1;i < j;i++,j--){ temp = prefix_str[i]; prefix_str[i] = prefix_str[j]; prefix_str[j] = temp; } printf("\n\nEquivalent prefix expression is: "); printf("%s\n",prefix_str); printf("\n"); return 0; } //changes in displaypost void displaypost(char * s){ struct Stack *temp,*p; if(pstart == NULL) printf(""); else{ temp = pstart; int i = 0; while(temp;= NULL){ p = temp; s[i] = temp->data;//store character in array temp = temp->next; free(p);//free storage i++; } s[i] = '\0'; } pstart = NULL; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM