实验四、栈的顺序和链式存储的表示和实现实验目的:1.熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等。2.掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现。实验内容:1.栈的顺序表示和实现编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能。(1)初始化顺序栈(2)插入一个元素(3)删除栈顶元素(4)取栈顶元素(5)遍历顺序栈(6)置空顺序栈#include#include#defineMAXNUM20#defineelemtypeint//定义顺序栈的存储结构typedefstruct{elemtypestack[MAXNUM];inttop;}sqstack;//初始化顺序栈voidinitstack(sqstack*p){if(!p)printf("error");p->top=-1;}//入栈voidpush(sqstack*p,elemtypex){if(p->toptop=p->top+1;p->stack[p->top]=x;}elseprintf("\noverflow!\n");}//出栈elemtypepop(sqstack*p){elemtypex;if(p->top!=0){x=p->stack[p->top];printf("以前的栈顶数据元素%d已经被删除!\n",p->stack[p->top]);p->top=p->top-1;return(x);}else{printf("栈为空\n");return(0);}}//获取栈顶元素elemtypegettop(sqstack*p){elemtypex;if(p->top!=-1){x=p->stack[p->top];returnx;}else{printf("Underflow!\n");return0;}}//遍历顺序栈voidoutstack(sqstack*p){inti;printf("\n");if(p->top<0)printf("这是一个空栈!\n");for(i=p->top;i>=0;i--)printf("第%d个数据元素是:%6d\n",i,p->stack[i]);}//置空顺序栈voidsetempty(sqstack*p){p->top=-1;}//主函数main(){sqstack*q;inty,cord;elemtypea;do{printf("\n第一次使用必须初始化!\n\n");printf("\n主菜单\n");printf("\n1初始化顺序栈\n");printf("\n2插入一个元素\n");printf("\n3删除栈顶元素\n");printf("\n4取栈顶元素\n");printf("\n5置空顺序栈\n");printf("\n6结束程序运行\n");printf("\n----------------------------------\n");printf("请输入您的选择(1,2,3,4,5,6)");scanf("%d",&cord);printf("\n");switch(cord){case1:{q=(sqstack*)malloc(sizeof(sqstack));initstack(q);outstack(q);}break;case2:{printf("请输入要插入的数据元素:a=");scanf("%d",&a);push(q,a);outstack(q);}break;case3:{pop(q);outstack(q);}break;case4:{y=gettop(q);printf("\n栈顶元素为:%d\n",y);outstack(q);}break;case5:{setempty(q);printf("\n顺序栈被置空!\n");outstack(q);}break;case6:exit(0);}}while(cord<=6);}2.栈的链式表示和实现编写一个程序实现链栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能。(1)初始化链栈(2)入栈(3)出栈(4)取栈顶元素(5)置空链栈(6)遍历链栈参考代码:#include#include#include#definenull0typedefintelemtype;typedefstructstacknode{elemtypedata;stacknode*next;}stacknode;typedefstruct{stacknode*top;}linkstack;//初始化链栈voidinitstack(linkstack*s){s->top=null;printf("\n已经初始化链栈!\n");}//链栈置空voidsetempty(linkstack*s){s->top=null;printf("\n链栈被置空!\n");}//入栈voidpushlstack(linkstack*s,elemtypex){stacknode*p=newstacknode;p->data=x;p->next=s->top;s->top=p;}//出栈elemtypepoplstack(linkstack*s){stacknode*p;elemtypee;p=s->top;if(s->top==null){printf("\n栈空\n");exit(-1);}e=p->data;s->top=p->next;deletep;returne;}//取栈顶元素elemtypestacktop(linkstack*s){if(s->top==0){printf("\n链栈空\n");exit(-1);}returns->top->data;}//遍历链栈voiddisp(linkstack*s){printf("\n链栈中的数据位:\n");printf("=======================================\n");stacknode*p;p=s->top;while(p!=null){printf("%d\n",p->data);p=p->next;}printf("=====================================\n");}//主函数voidmain(){printf("链栈操作\n");inti,m,n,a;linkstack*s;s=(linkstack*)malloc(sizeof(linkstack));intcord;do{printf("\n第一次使用必须初始化!\n\n");printf("\n主菜单\n");printf("\n1初始化链栈\n");printf("\n2入栈\n");printf("\n3出栈\n");printf("\n4取栈顶元素\n");printf("\n5置空链栈\n");printf("\n6结束程序运行\n");printf("\n----------------------------------\n");printf("请输入您的选择(1,2,3,4,5,6)");scanf("%d",&cord);printf("\n");switch(cord){case1:{initstack(s);disp(s);}break;case2:{printf("输入将要压入链栈的数据的个数:n=");scanf("%d",&n);printf("依次将%d个数据压入链栈:\n",n);for(i=1;i<=n;i++){scanf("%d",&a);pushlstack(s,a);}disp(s);}break;case3:{printf("\n出栈操作开始!\n");printf("输入将要出栈的数据个数:m=");scanf("%d",&m);for(i=1;i<=m;i++){printf("\n第%d次出栈的数据是:%d\n",i,poplstack(s));}break;}case4:{printf("\n\n链栈的栈顶元素为:%d\n\n",stacktop(s));}break;case5:{setempty(s);disp(s);}break;case6:exit(0);}}while(cord<=6);}实验总结:顺序栈初始化插入元素删除栈顶元素(此时栈中元素为1,2,3,4)取栈顶元素置空顺序栈链栈初始化入栈出栈取栈顶元素置空链表