栈的操作算法实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一顺序栈的实现
#define maxsize 6 /*顺序栈的容量*/
typedef struct
{ ElementType data[maxsize];
int top;
}SqStackTp;
顺序栈被定义为一个结构类型,它有两个域data和top。data为一个一维数组,用于存储栈中元素,DataType为栈元素的数据类型(有待设定)。top
为int型,它的取值围为0..sqstack_maxsize-1。top=0表示栈空,
top=sqstack_maxsize-1表示栈满。对于图3-2顺序栈sqstack_ maxsize应为6。
下面讨论栈的基本运算在顺序栈上的实现。
1.初始化:初始化运算是将栈顶初始化为0;
int InitStack(SqStackTp *sq)
{ sq->top=-1; return(1);}
2.进栈:进栈的主要操作是:①栈顶下标加1;②将入栈元素放入到新的栈顶下标所指的位置上。
算法如下:
int Push(SqStackTp *sq, ElementType x) /*若栈未满,将元素x入栈sq中;否则提示出错信息*/
{ if(sq->top== maxsize-1) { printf("栈满");return(0);}
else { sq->top++; sq->data[sq->top]=x; return(1);}
}
3.退栈:退栈先要将栈顶元素取出,由参数返回,并将栈顶减1。
int Pop(SqStackTp *sq, ElementType *x);
{ if (sq->top==-1) { printf("下溢"); return(0);}
else { *x=sq->data[sq->top]; sq->top--; return(1);}
};
4.判栈空:
int EmptyStack(SqStackTp *sq) /*若栈空返回1;否则返回0*/
{ if (sq->top==-1) return(1) else return(0);
}
5.读栈顶元素:
int GetTop(SqStackTp *sq, ElementType *x) /*取栈顶元素,栈顶元素通过参数返回*/ {if (sq->top==-1) return(0);
else { *x=sq->data[sq->top]; return(1);}
}
6.顺序栈应用举例(进栈与出栈)
#include "stdio.h"
#define ElementType char
#define maxsize 40
typedef struct
{ ElementType data[maxsize];
int top;
} SqStackTp;
int InitStack(SqStackTp *sq)
{ sq->top=-1; return(1);}
int Push(SqStackTp *sq,ElementType x)
{if(sq->top== maxsize-1) { printf("栈满"); return(0);} else { sq->top++; sq->data[sq->top]=x; return(1);} }
int Pop(SqStackTp *sq,ElementType *x)
{ if (sq->top==-1){ printf("下溢"); return(0);} else { *x=sq->data[sq->top]; sq->top--; return(1);} }
int EmptyStack(SqStackTp *sq)
{if (sq->top==-1)return(1); else return(0);
}
/*主函数*/
void main( )
{ SqStackTp sq;
typedef ch ElementType;
InitStack(&sq);
for (ch='A';ch<='A'+12;ch++)
{ Push(&sq,ch); printf("%c",ch);}
printf("\n");
while(!EmptyStack(&sq))
{ Pop(&sq,&ch);printf("%c",ch); }
printf("\n");
}
运行结果:ABCDEFGHIJKLM
MLKJIHGFEDCBA
二链栈的实现
链栈类型定义如下:
typedef struct node
{ ElementType data;
struct node *next;
} node;
node *LStackTp;
下面讨论栈的基本运算在链栈上的实现。
1.初始化:栈初始化的作用是设置一个空栈。而一个空的链栈可以用栈顶指针为NULL来表示。
void InitStack(LStackTp *ls)
{ *ls=NULL;
}
2.进栈:进栈算法的基本步骤包括:
①申请一个新结点,并将x的值送入该结点的data域;
②将该结点链入栈中使之成为新的栈顶结点。
void Push(LStackTp *ls, ElementType x)
{ LStackTp p;
p=/*申请一个新结点*/
p->data=(LStackTp)malloc(sizeof(node));x; /*元素的值填入新结点的data域*/
p->next=*ls;/*原栈顶链入新结点的next域*/
*ls=p; /*新结点成为新的栈顶*/
}
3.退栈:退栈算法的基本步骤包括:
①栈顶结点的data域的值由参数返回,并取下栈顶结点,让它的下一个结点成为新的栈顶;
②将取出的栈顶结点空间释放。
int Pop(LStackTp *ls, ElementType *x)
/*栈顶元素通过参数返回,它的直接后继成为新的栈顶*/
{ LStackTp p;
if((*ls)!=NULL)
{ p=*ls; *x=p->data; /*栈顶元素通过参数返回 */
*ls=p->next;/*原栈顶的下一个结点成为新的栈顶*/
free(p); /*释放原栈顶结点空间*/
return 1; }
else return 0;
}
4.判栈空:
int EmptyStack(LStackTp *ls)/*若栈为空则返回值1,否则返回值0 */ { if(*ls==NULL) return(1); else return(0);}
5.读栈顶元素:
int GetTop(LStackTp *ls, ElementType *x)/*取栈顶元素*/
{ if((*ls)!=NULL){ *x=(*ls)->data;return 1;} else return 0; }