一,顺序栈的基本算法
(1)初始化
void InitStack(SqStack *S){
S->top=-1;
}
(2)判栈空
bool StackEmpty(SqStack S){
if(S->top==-1){
return TRUE;\\栈为空
}else {
return FALSE;\\不为空
}
(3)入栈Push
Status Push(SqStrack *S,Eemptype e){
if(S->top==MAXSIZE -1){
return ERROR;}\\栈为空
S->top++;
S->Data[S->top]=e;
return OK;
}
(4)出栈Pop
Status Pop(SqStack *S,Emetype *e){
if(S->top==MAXSIZE-1){
return ERROR;}
*e=S->Data[S->top];
S->top--;
return OK;
}
(5)读栈顶元素
Status GetTop(SqStatus *S,Emetype *e){
if(S->top==-1){
return ERROR;}
*e=S->Data[S->top];
return e;
}
二,共享栈
(1)共享栈概念
两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸
两个栈的栈顶指针都指向栈顶元素,top0=-1时0号栈为空,top1=MaxSize时1号栈为空;仅当两个栈顶指针相邻(top0+1=top1)时,判断为栈满。当0号栈进栈时top0先加1再赋值,1号栈进栈时top1先减一再赋值出栈时则刚好相反。
(2)共享栈的空间结构
#define MAXSIZE 50
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
int top0;
int top1;
}SqDoubleStack;
(3)共享栈进栈
判断是栈0还是栈1的栈号参数stackNumber。
Status Push(SqDoubleStack *S,ElemType e,int StackNumber){
if(S->top0+1=S->top1){
return ERROR;} \\栈满
if(StackNumber=0){
S->data[++S->top0]= e;
}\\0栈加一
if(StackNumber=1){
S->data[--S->top1]=e
}\\1栈减一
return ok
}
(4)共享栈出栈
Status Pop(SqDoubleStack *S,ElemType*e,int StackNumber){
if(StackNumber=0){
if(S->top0=-1){
return ERROR;}\\0栈空
*e=S->data[S->top0--];
}
if(StackNumber=1){
if(S->top1=MAXSIZE){
return ERROR;}
*e=S->data[S->top1++];
}
return ok;
三,栈的链式存储结构
1.链栈
这里规定链栈没有头节点,Lhead指向栈顶元素。
对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是top=NULL的时候。
链栈的结构代码
/*构造节点*/
typedef Struct StackNode{
ElemType data;
struct StackNode *next;
}StackNode,*LinkStackPrt;
/*构造链栈*/
typedef Stuct LinkStack{
LinkStackPrt top;
int count;
}LinkStack;
2.链栈的基本算法
(1)链栈的进栈
Status Push(LinkStack *s,ElemType e)
{
LinkStackPrt p=(LinkStackPrt)malloc(sizeof(StackNode));
p->data=e;
p->next=s->top;
s-<top=p;
s->count++;
return OK;
}
(3)链栈的出栈
Status Pop(LinkStack *s,ElemType *e)
{
LinkStackPtr p;
if(StackEmpty(*s)){
return ERROR;
}
*e=s->top->data;
p=s->top;
s->top=s->top->next;
free(p);
s->count--;
return OK;
}
四,栈的应用——递归
(1)递归的定义
简单地说,若在一个函数、过程或数据结构的定义中又应用了它自身,则这个函数、过程或数据结构称为是递归定义的,简称递归。
(2)斐波那契数列
int Fib(int n){
if(n==0){
return 0;
}else if(n==1){
return 1;
}else{
return Fib(n-1)+Fib(n-2);
必须注意递归模型不能是循环定义的,其必须满足下面的两个条件
- 递归表达式(递归体)
- 边界条件(递归出口)
五、栈的应用——四则运算表达式求值
后缀表达式计算规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进项运算,运算结果进栈,一直到最终获得结果。