栈的操作算法实现

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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; }

相关文档
最新文档