C用栈实现中缀表达式转后缀表达式

 

#include <Stdio.h>

#include <Conio.h>

#include <Stdlib.h>

#define Maxsize 100 /*设顺序表的最大长度为100,可依具体情况分配空间*/

 

typedef char datatype;

 

typedef struct

 

{

 

       datatype data[Maxsize];

 

       int top;/*栈顶指针*/

 

}SeqStack;/* 顺序栈类型定义 */

 

 

/* 构造一个空栈 */

 

SeqStack *InitStack()

 

{

 

       SeqStack *s;/* s为顺序栈类型变量的指针*/

 

       s=(SeqStack *)malloc(sizeof(SeqStack));

 

       if(!s)

 

       {

 

              printf("空间不足/n");

 

              return NULL;

 

       }

 

       else

 

       {

 

              s->top=-1;

 

              return s;

 

       }

 

}

 

/* 取栈顶元素 */

 

datatype GetTop(SeqStack *s)

 

{

 

       if(s->top == -1)

 

       {

 

              printf("/n栈是空的!");

 

              return 0;

 

       }

 

       else

 

              return s->data[s->top];

 

}

 

/* 入栈 */

 

SeqStack *Push(SeqStack *s,datatype x)

 

{

 

       if(s->top == Maxsize-1 )

 

       {

 

              printf("/n栈是满的!");

 

              return NULL;

 

       }

 

       else

 

       {

 

              s->top++;

 

              s->data[s->top]=x;

 

              return s;

 

       }

 

}

 

/* 出栈 */

 

datatype Pop(SeqStack *s)

 

{

 

       if(s->top == -1)

 

       {

 

              //printf("/n栈已经空了!");

 

              return 0;

 

       }

 

       s->top--;

 

       return s->data[s->top+1];

 

}

 

/* 判别空栈 */

 

datatype SeqStackEmpty(SeqStack *s)

 

{

 

       if(s->top ==-1)

 

       {

 

             // printf("此栈是空栈!");

 

              return 1;

 

       }

 

       else

 

       {

 

             // printf("此栈不是空栈!");

 

              return 0;

 

       }

 

}

 

 void display(SeqStack *p)

 

{

 

       int t ;

 

       t = p->top;

 

       if(p->top==-1)

 

       {

 

              printf("/n此栈是空的");

 

       }

 

       else

 

              while(t!=-1)

 

              {

 

                     printf("%d->",p->data[t]);

 

                     t--;

 

              }

 

}

 

 /* 检测括号是否配对 */

int CheckBracket(char *str)

{

  int i=0;

  SeqStack *p= InitStack();

 

  datatype ch;

 

  while(str[i])

  {

    ch=str[i];

 

    if(ch=='(')

    {

       Push(p,ch); //遇到左括号入栈 

 

     }

    else

    if(ch==')') 

    {

      if(Pop(p)==0)  //遇到右括号出栈,如果栈为空,则表达式缺左括号 

      {

       return 0; 

      }

 

    }

    i++;

  }

 

  return SeqStackEmpty(p); //栈空则表示配对,栈不为空则表示缺右括号 

}

 

 

/*  判断优先级 */

char proceed(char left,char right)

{

/* 设定优先矩阵 */

char PriorityMatrix[][8]={

                          {'0','+','-','*','/','(',')','#'},

                          {'+','>','>','<','<','<','>','>'},

                          {'-','>','>','<','<','<','>','>'},

                          {'*','>','>','>','>','<','>','>'},

                          {'/','>','>','>','>','<','>','>'},

                          {'(','<','>','<','<','<','=',' '},

                          {')','>','<','>','>',' ','>','>'},

                          {'#','<','<','<','<','<',' ','='}

                         };

  int i,j;

  for(i=0;i<8;i++)

   if(PriorityMatrix[i][0]==left) break;

 

  for(j=0;j<8;j++)

   if(PriorityMatrix[0][j]==right) break;

 

   return PriorityMatrix[i][j];

}

 

int isNum(char str)

{

 char oper[]={'0','1','2','3','4','5','6','7','8','9'};

 int temp,i;

  for(i=0;i<10;i++)

  { if(oper[i]==str)

     return 1;

  }

   return 0;

}

 

void post(char r[])

{

    char temp,str;

    int j=0;

    SeqStack *s;

    s=InitStack();

 

    Push(s,'#');

 

    str=r[j];

 

    while(!(str=='#' && GetTop(s)=='#'))

    {

 

      if(isNum(str))

      {

        printf("%c",str);

        str=r[++j];

      }

      else

      if(proceed(GetTop(s),str)=='<')

      {

       Push(s,str);

       str=r[++j];

      }

      else

      if(proceed(GetTop(s),str)=='>')

      {

       temp=Pop(s);

        printf("%c",temp);

      }

      else

      if(proceed(GetTop(s),str)=='=' &&

         GetTop(s)=='(' && str==')')

      {

        temp=Pop(s);

        str=r[++j];

      }

    }

}

int main(void)

{

 /* 此处添加你自己的代码 */

 char str[]="3+1*(2+4)#";

 

 

 printf("%s/n",str);  //打印前缀 

 

if(CheckBracket(str)==1) //判断括号是否配对 

{

   post(str); //处理成后缀并打印出来 

}

else

{

   printf("Brackets are not matched");

}

  printf("/n");

  system("pause"); 

  return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值