反向波兰符号的中缀

Posted

技术标签:

【中文标题】反向波兰符号的中缀【英文标题】:Infix to reverse polish notation 【发布时间】:2015-03-24 10:20:54 【问题描述】:

我正在编写将中缀表达式转换为反向表示法的代码,但我的程序在执行文件时崩溃

typedef struct stack
 
   char a[400];
   int top;
 
 stack;
 stack s;
 void push(char *,int);
 int pop();

 int main()
  
    char x[400];
    int len,i,y;
    puts("Enter string");
    scanf("%s",x);
    len=strlen(x);
    for(i=0;i<len;i++)
      
//considering user is entering only the small alphabets 

      if((x[i])>=97&&x[i]<=122)
      printf("%s",x[i]);

      else
//if encountering the operator then pushing it into stack

      if(x[i]=='/'||x[i]=='*'||x[i]=='+'||x[i]=='-')
        
        push(x,i);
        

      else if(x[i]=='(')
      continue;
//When encountering the ')' then popping the operator

      else
        
        y=pop();
        printf("%c",y);
        
    

  return 0;
 

将数组及其大小作为参数传递

void push(char *x,int i)

  stack s;
  s.top++;
  s.a[s.top]=x[i];

在找出“)”时返回弹出的操作符

int pop()
 
   stack s;
   int temp;
   temp=s.a[s.top];
   s.top--;
   return temp;
 

【问题讨论】:

哪里崩溃了? 输入输入表达式时 【参考方案1】:

在您的代码中

printf("%s",x[i]);

错了。你想要的是

printf("%c",x[i]);

按照C11 标准,章节7.21.6.1%s 格式说明符

如果不存在 l 长度修饰符,则参数应为 指向初始值的指针 字符类型数组的元素。 ...

但这里 x[i] 的类型是 char

另外,从第 9 段开始,

如果有任何参数 不是相应转换规范的正确类型,行为是 未定义。

所以,您的代码调用了undefined behaviour。

接下来,对于push()pop() 这两个函数,您将定义一个局部变量stack s;它在每次调用这些函数时创建,并在完成执行时销毁。您可能想改用 gloabl 变量。删除局部变量,不需要它们。

另外,对于这两个函数,您使用s.top 值作为s.a 数组的索引,但没有对其进行任何边界检查。在使用 s.top 值作为索引之前,您应该检查堆栈满情况 (push()) 和堆栈空情况 (pop()) 的数组索引值。 s.top的递增和递减也要放在check下。


编辑:

对于逻辑部分,在解析完所有输入后,您应该检查堆栈上是否还有要弹出的元素。您应该 print 堆栈包含,直到堆栈变为空才能获得 complete 符号。查看我下面的评论以了解伪代码的想法。


注意:根据C 标准,int main() 应该是int main(void)

【讨论】:

现在它只打印第一个字母然后崩溃 是的,现在它正在工作,但其中存在逻辑错误,不是大括号部分的运算符没有错误打印,例如 (a+b)*(c+d) 正在打印ab+cd+ 关于删除局部变量部分,局部变量是否比全局变量具有更高的优先级? @LEONARDO 是的,局部变量总是遮蔽全局变量。 @LEONARDO 和逻辑部分,在你解析完 all 输入之后,你应该检查堆栈上是否还有任何东西。就像在伪代码中一样,while (s.top !=0) y = pop(); printf("%c", y) ; 。试试这个,让我们知道结果。

以上是关于反向波兰符号的中缀的主要内容,如果未能解决你的问题,请参考以下文章

问题C ++反向波兰语表示法计算器

中缀符号到反波兰符号

反向波兰表示法Java

JavaScript中缀表达式转为逆波兰式(四则运算)

使用逆波兰式进行表达式求值

java 150.评估反向波兰表示法(#)