c - 中缀到后缀转换的输出中未知字符代替运算符

标签 c postfix-notation infix-notation

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define max 10
void eval(char []);
struct stack
{
   int top;
   int info[max];
};
int main()
{
    char inf[20];
    printf("\n Enter the string ");
    scanf("%s",inf);
    printf("%s",inf);
    eval(inf);
    return 0;
}
void eval(char inf[])
{
   struct stack s; s.top=-1;
   int instack(char);
   int incoming(char);
   void push(struct stack *, char);
   char pop(struct stack *);
   int i,j=0,ip,is,k;
   char pst[20],ch,x;
   for(i=0;i<strlen(inf);i++)
   {
        ch=inf[i];
        if(isdigit(ch))
        {
            pst[j]=ch; 
            j++;
        }
        else if(ch==')')
        {
           while(x=pop(&s)!='(')
           {
                pst[j]=x; j++;
           }
        }
       else if(s.top==-1)
        {
              push(&s,ch);
        }
        else
        {
              ip=incoming(ch);
              is=instack(s.top);
              if(ip>is)
              {
                  push(&s,ch);
              }
              else
              {
                while((incoming(k=pop(&s))<(instack(s.top))))
                {
                  pst[j]=pop(&s);
                  j++; 
                }
                push(&s,ch);
              }
         }
    }
  while(s.top!=-1)
  {
        pst[j]=pop(&s);
        j++;
  }
  pst[j]='\0';
  printf("\n%s",pst);
}
void push(struct stack *s,char ch)
{
    s->top=s->top+1;
    s->info[s->top]=ch;
}
char pop(struct stack *s)
{
    char ch;
    ch=s->info[s->top];
    s->top=s->top-1;
    return ch;
}
int incoming(char ch)
{
    switch(ch)
    {
        case '+': 
        case '-': return 1; break;
        case '*':
        case '/': return 2; break;
        case '(':  return 4; break;
    }
}
int instack(char ch)
{
    switch(ch)
    {
        case '+':
        case '-': return 1;break;
        case '*': 
        case '/': return 2; break;
        case '(': return 0; break;
    }
}

我得到的 i/p- (5+6)*(3-2) 输出是 56?32?(星号)。我在 Linux 机器上使用 GCC 编译器。输出由 ?和 ?代替 + 和 - 运算符。 5+6 等简单输入已正确转换。我得到的输出是 56+。只有带括号的输入才能生成这些?出现。

最佳答案

一个非常小的错误,while(x=pop(&s)!='(') 将其更改为 while( (x=pop(&s)) !='(' ) 。现在,它给出了您想要的输出。 :)

关于c - 中缀到后缀转换的输出中未知字符代替运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45059612/

相关文章:

c# - 用一元/二元运算符中缀的后缀

c - 我需要帮助在 C 中从中缀转换为后缀

java - 中缀算法仅返回最后一个数字

c - 使用套接字的 lpNumberOfBytesRead 和 lpNumberOfBytesWritten

c - 将链表中的值添加到变量

c - 预测结构

.net - 简单代数简化的算法/操作方法

C语言前缀后缀问题

C++ 数学表达式解析器问题

c - ATtiny 编程功能 - 似乎卡住