后缀C程序的中缀

时间:2019-01-25 15:35:55

标签: c data-structures stack

我一直在开发一个程序,以借助堆栈将中缀输入转换为后缀。
我制作的程序如下

这是一个无限循环,没有打印任何相关内容。我一直在尝试查找错误,但没有成功,编译器也未发出任何警告。

#include<stdio.h>

char po[20];
int top = -1;

void push(char x) {
  po[++top] = x;
}

char pop() {
  if (top == -1)
    return -1;
  else
    return po[top--];
}

int priority(char x) {
  if (x == '(')
    return 0;
  if (x == '+' || x == '-')
    return 1;
  if (x == '*' || x == '/')
    return 2;
}

main() {
  char st[20], x;
  int a, c = 0, op;
  printf("Enter the expression ");
  scanf("%s", st);
  while (st[c] != '\0') {
    if (st[c] >= 'a' && st[c] <= 'z')
      printf("%c", st[c]);
    else if (st[c] == '(')
      push(st[c]);
    else if (st[c] == ')')
      ;
    {
      while ((x = pop()) != '(')
        printf("%c", pop());
    }
    if (st[c] == '*' || st[c] == '/' || st[c] == '+' || st[c] == '-'
        || st[c] == '^') {
      while (priority(po[top]) >= priority(st[c]))
        printf("%c", pop());
      push(st[c]);
    }
    c = c + 1
  }
  while (top != -1) {
    printf("%c", pop());
  }
}

2 个答案:

答案 0 :(得分:1)

  

编译器也没有发出任何警告。

节省时间。启用所有警告或获得更好的编译器。

warning: control reaches end of non-void function [-Wreturn-type]

查看下面的函数,并发现它没有为所有可能的x返回一个值。

int priority(char x) {
  if (x == '(')
    return 0;
  if (x == '+' || x == '-')
    return 1;
  if (x == '*' || x == '/')
    return 2;

  // Missing return
}

warning: suggest braces around empty body in an 'if' statement [-Wempty-body]

以下代码可疑。您真的要在;之后再输入else if (st[c] == ')')吗?

else if (st[c] == ')')
  ;

error: expected ';' before '}' token

肯定是错字(缺少;)

// c = c + 1
c = c + 1;

也可能存在其他问题。

答案 1 :(得分:0)

这是至少没有给出无限循环的代码版本。

更改为注释:

  1. 始终将{ }if块和循环块一起使用。
  2. 在这段代码中,除了其他人指出的不必要的;之外,您还要弹出两次!这不是你想要的。如果弹出printf(),则此while循环将永远不会终止,因为它将永远不会看到(

    else if(st[c]==')') {
            while((x=pop()) != '(') {
               printf("%c",pop());
            }
        }
    

    这是固定代码的样子:

    else if(st[c]==')') {
            while((x=pop()) != '(') {
               printf("%c",x);
            }
        }
    

最后,您的函数始终具有默认的return

  • 您的代码中仍然可能存在其他逻辑错误。只是现在还没有产生无限循环。

代码:

#include<stdio.h>

char po[20];
int top = -1;

void push(char x)
{
    po[++top] = x;
}
char pop()
{
    if(top==-1)
        return -1;
    else
        return po[top--];
}

int priority(char x)
{
    if(x == '(')
        return 0;
    if(x == '+' || x == '-')
        return 1;
    if(x == '*' || x == '/')
        return 2;
    return -1;
}

int main()
{
    char st[20],x;
    int a,c=0,op;
    printf("Enter the expression ");
    scanf("%s",st);
    while(st[c]!='\0')
    {
        if(st[c]>='a'&& st[c]<='z') {
            printf("%c",st[c]);
        }
        else if(st[c]=='(') {
            push(st[c]);
        }
        else if(st[c]==')') {
            while((x=pop()) != '(') {

                printf("%c",x);
            }
        }


        if(st[c]=='*' || st[c]=='/' || st[c]=='+' || st[c]=='-' || st[c]=='^')
        {
            while(priority(po[top])>priority(st[c])) {

                printf("%c",pop());
            }
            push(st[c]);
        }


        c=c+1;
    }
    while(top!=-1)
    {


        printf("%c",pop());
    }
}

输出:

输出内容如下:

  

junglefox @ ubuntu:〜/ test_programs / $

     

./ test输入表达式(2 + 3)* 4/5 * 2 * 3-4 /(5 + 4)

     

+ ** / * + /-junglefox @ ubuntu:〜/ test_programs / $