什么是堆栈
具有一定操作约束的线性表。表达式求值,就是堆栈的应用。
后缀表达式
平常生活中所用的是中缀表达式。而计算机需要使用后缀表达式。
堆栈的抽象数据类型描述
类型名称:堆栈
数据对象集:一个有0个或多个元素的有穷线性表。
操作集:生成空堆栈、判断堆栈是否已满、将元素item压入堆栈、判断堆栈是否为空、删除并返回栈顶元素。
堆栈的顺序存储实现
1、结构体
#define MaxSize <存储数据元素的最大个数>
typedef struct SNode *Stack;
struct SNode{
ElementType Data[MaxSize];
int Top;
};
2、操作
(1)入栈
void Push(Stack PtrS,ElementType item){
if(PtrS->Top == MaxSize-1){
printf("堆栈满");
return;
}else{
PtrS->Data[++PtrS->Top] = item;
return;
}
}
(2)出栈
ElementType Pop(Stack PtrS){
if(PtrS->Top == -1){
printf("堆栈空");
return ERROR;
}else{
return(PtrS->Data[(PtrS->Top)--]);
}
}
eg:用一个数组实现两个堆栈,要求最大地利用数组空间,使数组只要有空间入栈操作就能成功。
提示:头尾分别作为两个堆栈的栈顶,入栈时则可从头尾开始push,直到两个堆栈
堆栈的链式存储实现
1、结构体
typedef struct SNode *Stack;
struct SNode{
ElementType Data;
struct SNode *Next;
};
2、操作
(1)构建新链栈
Stack CreateStack(){
Stack s;
s = (Stack)malloc(sizeof(struct SNode));
s -> Next = NULL;
return S;
}
(2)判断是否为空
int IsEmpty(Stack S){
return (S->Next == NULL);
}
(3)push操作
void Push(ElementType item, Stack S){
struct SNode *TmpCell;
TmpCell=(struct SNode *)malloc(sizeof(struct SNode));
TmpCell->Next=S->Next;
S->Next=TmpCell;
}
(4)pop操作
ElementType Pop(Stack S){
struct SNode *FirstCell;
ElementType TopElem;
if(IsEmpty(S)){
printf("堆栈空");
return NULL;
}else{
FirstCell=S->Next;
S->Next=FirstCell->Next;
TopElem=FirstCell->Element;
free(FirstCell);
return TopElem;
}
}
注:S代表栈顶。
中缀表达式如何转换为后缀表达式
从头到尾读取中缀表达式的每个对象,对不同对象按不同的情况处理。
1、运算数直接输出
2、左括号压入堆栈
3、右括号将栈顶的运算符弹出并输出,直到遇到左括号
4、运算符:如果优先级大于栈顶元素,则压栈;反之,则弹出并输出,并比较新的栈顶元素,直到该运算符优先级大于栈顶运算符为止。然后将该运算符压栈。
5、若对象处理完毕,则把堆栈中存留的运算符一并输出。
堆栈的其他应用
函数的调用及递归实现
深度优先搜索
回溯算法