后缀表达式与栈

/*
*stack,操作受限制的线性表,在表的一端进行插入和删除,先进后出(FILO),后进先出(LIFO)。表尾是栈顶(top),表头是栈底(bottom)。
*top不是指针类型,但习惯称为栈顶指针,习惯用词还有push和pop表示入栈和出栈
*栈空,top是-1(数组)或者0,看是怎么约定的,这里采用栈空指向0
*例子采用C++,文档后缀cpp,struct关键词省略
*至于栈的链表方式(链栈),可以把之前链表的作为list.h包含进来直接用,一般把top作为头指针
*栈的应用:后缀表达式计算、中缀表达式变后缀表达式

*/


/*
*中缀表达式变后缀表达式*
计算机存储的时候,是用的后缀表达式
中缀:9+(3-1)*3+10/2
后缀:9 3 1-3*+ 10 2/+,所有的符号都在相关计算数字的后面出现,相邻的运算符,高级别的在前面
**
栈里面放入后缀表达式时,遇到了运算符,就把左边的两个数字拿出来计算,里面的一个数字作为被计算的(被除或被减),然后结果入栈

转变时,若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止

*/

例子简单,没有考虑到不是一位整数及符号等情况

定义字符栈及pop\push\isdigit\prior函数


 string expr = "1+2*3/(4-1)";//或者输入用gets
 Stack postfix;//后缀栈
 Stack oper;//运算符栈


 for (int i = 0; i < strlen(expr); i++) {
  char ch = expr[i];
 if (isdigit(ch)) 
   push(&postfix, ch);
 else if(ch == '(’)     //括号的处理
   push(&oper, ch);
 else if(ch == ')') {
   while (top(&oper) != '(') {
    push(&postfix, top(&oper));
    pop(&oper);
    }
    pop(&oper);
   }
 else {
   while(!empty(&oper) && top(&oper) != '(' && !prior(ch, top(&oper))) {
    push(&postfix, top(&oper));
    pop(&oper);
   }
 push(&oper, ch);
  }
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值