2.2.1 什么是堆栈
- 后缀表达式 中缀表达式 前缀表达式
顺序存储运算数,并倒序输出 - 堆栈: 具有一定操作约束的线性表 只在一端(栈顶,Top)做插入删除
- 插入数据:入栈(Push)
删除数据:出栈(Pop)
后入先出:LIFO
操作集
Stack CreatStack(int MaxSize);
int IsFull(Stack S,int MaxSize);
void Push(Stack S,ElementType item);
int IsEmpty(Stack S);
ElementType Pop(Stack S);
2.2.2 栈的顺序存储实现
一个一维数组+一个记录栈顶元素位置的变量
#define MaxSize 15
typedef struct SNode *Stack;
struct SNode{
ElementType Data[Maxsize];
int Top;
};
void Push(Stack PtrS,ElementType item)
{
if(PtrS->Top==MaxSize-1)
printf("FULL\n");
else
PtrS->Data[++(PtrS->Top)]=item;
}
ElementType Pop(Stack PtrS)
{
if(PtrS->Top==-1){//易犯错误为Top忘记初始化为-1
printf("NONE\n");
return ERROR;
}
else
return PtrS->Data[(PtrS->Top)--] ;
}
2.2.3 栈的链式存储实现
实际上就是一个单向链表,叫做链栈,插入删除只能在链栈的栈顶进行 链表头适合作为Top
typedef struct SNode *Stack;
struct SNode{
ElementType Data;
Stack Next;
};
Stack CreatStack()
{
Stack S;
S=(Stack)malloc(sizeof(SNode));
S->Next=NULL;
return S;
}
int IsEmpty(Stack S)
{
return (S->Next==NULL) ;
}
void Push(ElementType item,Stack S)//链表无需考虑是否满
{
Stack tmp;//定义
tmp=(Stack)malloc(sizeof(SNode));//分配空间
tmp->Data=item;//存入数据
tmp->Next=S->Next;//插入tmp
S->Next=tmp;
}
ElementType Pop(Stack S)
{
if(S->Next==NULL){
printf("NONE\n");
return ERROR;
}
else{
ElementType tmp=S->Next->Data;
Stack tnp=S->Next;
S->Next=tnp->Next;
free(tnp);
return tmp;
}
}
2.2.4 堆栈应用:表达式求值
- 后缀:从左到右读入各项 判别 数入栈 符出栈 最后Pop栈顶元素
中缀:转换为后缀 重复上述 - 堆栈的其他应用:
函数调用及递归实现(important)
深度优先搜索
回溯算法
…