1、栈的操作算法实现一 顺序栈的实现#define maxsize 6 /*顺序栈的容量*/ typedef struct ElementType datamaxsize;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.初始化
2、: 初始化运算是将栈顶初始化为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-datasq-top=x; return(1);3.退栈:退栈先要将栈顶元素取出,由参数返回,并将栈顶减。int P
3、op(SqStackTp *sq, ElementType *x); if (sq-top=-1) printf(下溢); return(0);else *x=sq-datasq-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)
4、;else *x=sq-datasq-top; return(1);6.顺序栈应用举例(进栈与出栈)#include stdio.h#define ElementType char#define maxsize 40typedef struct ElementType datamaxsize;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);el
5、se sq-top+; sq-datasq-top=x; return(1);int Pop(SqStackTp *sq, ElementType *x) if (sq-top=-1) printf(下溢); return(0);else *x=sq-datasq-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
6、(ch=A;chdata=(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; /*栈
7、顶元素通过参数返回 */ *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;6
8、.链栈应用举例(进栈与出栈)1)#include stdio.h#define ElementType char#define size sizeof(node)typedef struct ElementType data;struct node *next; node ; node *LStackTp;void InitStack(LStackTp *ls)*ls=NULL;void Push(LStackTp *ls, ElementType x) LStackTp p;p=(LStackTp)malloc(size);p-data=x;p-next=*ls;*ls=p;int Pop(
9、LStackTp *ls, ElementType *x) LStackTp p;if(*ls)!=NULL) p=*ls;*x=p-data;*ls=(*ls)-next;free(p);return(1); else return(0);int EmptyStack(LStackTp ls)if(ls=NULL) return(1);else return(0);void main() LStackTp ls;ElementType ch;InitStack(ls);for (ch=A;chdata);printf(n);while(!EmptyStack(ls) Pop(&ls,&ch)
10、;printf(%c,ch); printf(n);运行结果:ABCDEFGHIJKLMMLKJIHGFEDCBA2)写一个算法,借助栈将一个带头结点的单链表倒置。head头a1a2 .anNULL分析:这里可利用栈的特征,先沿着链表从头至尾扫描一遍,将链表的每个结点的data域的值依次进栈,然后再沿着链表从头至尾扫描一遍,同时栈中元素依次出栈,并填入到链表的每个结点的data域中。算法如下:void reverse_list(LkListTp *head) LStackTp ls,p; ElementType x; InitStack(&ls); /*初始化链栈 */p=(*head)-ne
11、xt; while(p!=NULL) Push(&ls,p-data); p=p-next; p=(*head)-next; while (!EmptyStack(ls) Pop(&ls,&x); p-data=x; p=p-next;实现程序如下:(用链栈实现单链表倒置)#include stdio.h#define ElementType char#define size sizeof(node)typedef struct ElementType data;struct node *next; node;node *LkListTp;void InitStack(LStackTp *ls
12、) *ls=NULL; void Push(LStackTp *ls, ElementType x) LStackTp q;q=(LStackTp)malloc(size); /*申请一个新结点*/q-data=x; /*元素的值填入新结点的data域*/q-next=*ls; /*原栈顶链入新结点的next域*/*ls=q; /*新结点成为新的栈顶*/int Pop(LStackTp *ls, ElementType *x)/*栈顶元素通过参数返回,它的直接后继成为新的栈顶*/ LStackTp p;if(*ls)!=NULL) p=*ls;*x=p-data;*ls=(*ls)-next;
13、 /*原栈顶的下一个结点成为新的栈顶*/free(p); /*释放原栈顶结点空间*/return(1); else return(0);int EmptyStack(LStackTp ls) /*若栈为空则返回值1,否则返回值0*/if(ls=NULL) return(1);else return(0);void reverse_list(LkListTp *head) LStackTp ls,p;ElementType x;InitStack(&ls); /*初始化链栈 */p=(*head)-next;while(p!=NULL) Push(&ls,p-data); p=p-next; p
14、=(*head)-next;while (!EmptyStack(ls) Pop(&ls,&x); p-data=x; p=p-next;LkListTp create_lklist2()/*直接建表算法。p是一个pointer类型的变量,用来指示链入位置*/LkListTp p,q,s,head;ElementType x;head=(LkListTp)malloc(size); /*生成头结点*/p=head; /*尾指针置初值*/scanf(%c,&x); /*读入第一个元素*/while(x!=?) /*输入的不是结束标志时继续链入*/q=(LkListTp)malloc(size);
15、q-data=x; /*生成一个新结点*/p-next=q; /*新结点链入*/p=q; /*修改尾指针指向新的表尾*/scanf(%c,&x); /*读入下一个元素*/p-next=NULL;return(head); /*置尾结点标志*/void main()LkListTp p,q,head;ElementType x;printf(n input LkList:);head=create_lklist2();reverse_list(&head);printf(n output LkList:);p=head-next;while (p!=NULL) printf(%c,p-data);p=p-next; printf(n);运行结果: input LkList:ABCDEFG? output LkList:GFEDCBA
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1