前缀到前缀和后缀转换

时间:2019-10-28 07:25:28

标签: c

我正在编写将Infix表达式同时转换为Postfix和Prefix的代码。

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

如果我输入此表达式

A+B

预期输出为

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

但我的输出是

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 个答案:

答案 0 :(得分:0)

这是我的观察和修正:

  1. 收到关于gets的警告。改用fgetsgets是 危险,因为它可能导致缓冲区溢出。
  2. 释放在insert函数中分配的存储。 这些位置导致结果重复 intoprefix被呼叫。
  3. 由于您已经拥有intopostfix函数,因此我使用了相同的函数 使用以下算法将infix转换为prefix。请 refer

    步骤1:反转中缀表达式。请注意,在反转每个“( 变成')',每个')'变成‘(’。

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

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

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

  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;
    }