中缀表达式转换为后缀表达式


除括号外,栈中一直保持两个符号

都是现将数字前的符号入栈,然后打印符号后面的数字,然后判断符号是否出栈









#include <stdio.h>

#include <ctype.h>

#include <stdlib.h>

#define STACK_INIT_SIZE 20

#define STACKINCREMENT 10

#define MAXBUFFER 10

typedef double ElemType;

typedef struct {

  ElemType *base;

  ElemType *top;

  int stackSize;

}sqStack;

void InitStack(sqStack *s){

  s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));

  if(!s->base)

      exit(0);

  s->top = s->base;

  s->stackSize = STACK_INIT_SIZE;
//    return s;
}

void Push(sqStack *s, ElemType e){

  if(s->top - s->base >= s->stackSize){

      s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT)*sizeof(ElemType));

  if(!s->base)

      exit(0);

  s->top = s->base + s->stackSize;

  s->stackSize = s->stackSize + STACKINCREMENT;

}

  *(s->top) = e;

   s->top++;
//   return s;
}

void Pop(sqStack *s, ElemType *e){

  if(s->top == s->base)

     return;

  *e = *--(s->top);

}

int StackLen(sqStack s){

  return (s.top - s.base);

}

int main(){

    sqStack s;

    char c,e;

    InitStack(&s);

    printf("请输入中缀表达式,以#作为结束标志");

    scanf("%c",&c);

    while(c != '#'){

        while(c>='0'&&c<='9'){
            printf("%c",&c);  //处理连续数据
                       scanf("%c",&c);  //如果输入超出09范围,下次将不再进入while语句
            if(c<'0'||c>'9')
                printf(" ");
        }

        if(')' == c) {

            Pop(&s, &e);
            while ('(' != e) {

                printf("%c ", e);//有空格,分割不同数据

                Pop(&s, &e);

            }
        }
            else if('+' == c || '-' == c){

                if(!StackLen(s))

                    Push(&s,c);

                else{

                    do {

                        Pop(&s, &e);

                        if ('(' == e)

                            Push(&s, e);

                        else {

                            printf("%c ", e);

                        }
                    }
                        while(StackLen(s) && '(' != e);

                        Push(&s,c);

                    }

                }

                else if('*' == c || '/' == c || '(' == c){

                    Push(&s,c);

                }
            else if('#' == c)  //之前的限制被被0-9的语句解开,此处需要再次进行限制
                 break;
                else{

                    printf("出错,输入错误\n");

                    return -1;

                }

        scanf("%c",&c);
            }
    while(StackLen(s)){
        Pop(&s,&e);
        printf("%c ",e);  //输入完毕后如果栈内还有运算符,则直接弹出
    }

}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值