*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);
}
}