数据结构 c语言设计堆栈 并将中缀表达式转换成后缀表达式

主要是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

猜你喜欢

转载自blog.csdn.net/migeater/article/details/79161458