主要是1的部分中缀表达式到后缀表达式的转换
分析
中缀表达式
后缀表达式
直观上说是操作符位于操作数的前面,中间,后面
3 4 5 × −⇒3(45×)-⇒3-(4×5)
后缀表达式可以不需要括号
算法设计和实现
主要函数.h
int IsEmpty( Stack S );
Stack CreateStack( int MaxElements );
void DisposeStack( Stack S );
void MakeEmpty( Stack S );
void Push( ElementType X, Stack S );
ElementType Top( Stack S );
void Pop( Stack S );
ElementType TopAndPop( Stack S );
链表实现
在实现基数排序时,几乎已经实现过了
typedef struct Node
{
ElementType Element;
PtrToNode Next;
} * Stack;
这里只需要一个指针,因为是FILO,之前的rear指针作用是引导新的链表加入,head指针让最开始加入的元素先出;所以栈实现只要一个指针;
只需要绿色箭头,在汇编中也是如此.红色箭头指向的部分是栈顶,不改变
数组实现
int IsFull( Stack S ){
return S->TopOfStack == S->Capacity - 1;
}
typedef struct StackRecord
{
int Capacity;
int TopOfStack;
ElementType *Array;
}* Stack;
中缀到后缀
这里以链表栈为例
只考虑二元运算符,没有负号,不进行运算,因为输入问题,不考虑小数
分析的话,书55面是大致过程
更深层的逻辑因为水平和时间问题在博客补上
待处理的符号↓ 入栈后处理下一个 |
栈中的元素→ 栈底 |
( |
+- |
*/ |
) |
报错 |
(出栈,终止 |
出栈 |
出栈 |
+- |
入栈 |
入栈 |
出栈 |
出栈 |
*/ |
入栈 |
入栈 |
入栈 |
出栈 |
( |
入栈 |
入栈 |
入栈 |
入栈 |
jmp 代码实现
优先级与怎么判断没有必然联系,毕竟不是都是二元运算符
括号扮演着什么作用?
a+b*c |
abc*+ |
(a+b)*c |
ab+* |
c*(a+b) |
cab+* |
(就像一个内部栈的底部,碰到(则入栈并处理下个元素;如果待处理的是)则相当于把()内的全部清空再删除栈
测试用例
输入
((((((1+5)*((5+1)/7))))))
a + b * c + (d * e + f) *g
(a+b)/2
a+b/2
输出
15+51+7/*
abc*+de*f+g*+
ab+2/
ab2/+
代码实现
栈的实现
https://github.com/Haozun/algorithms/blob/master/Date/stack.h
中缀到后缀,处理文本
https://github.com/Haozun/algorithms/blob/master/Date/StackandConvertInfix.c