用顺序结构表示栈并实现栈的各种基本操作.docx
- 文档编号:2285725
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:21
- 大小:20.39KB
用顺序结构表示栈并实现栈的各种基本操作.docx
《用顺序结构表示栈并实现栈的各种基本操作.docx》由会员分享,可在线阅读,更多相关《用顺序结构表示栈并实现栈的各种基本操作.docx(21页珍藏版)》请在冰豆网上搜索。
用顺序结构表示栈并实现栈的各种基本操作
栈的顺序表示和实现
2.2基础实验
(1)掌握栈的顺序表示和实现
(2)掌握栈的链式表示和实现
(3)掌握队列的顺序表示和实现
(4)掌握队列的链式表示和实现
实验一:
栈的顺序表示和实现
【实验内容与要求】
编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
(1)初始化顺序栈
(2)插入元素
(3)删除栈顶元素
(4)取栈顶元素
(5)遍历顺序栈
(6)置空顺序栈
【知识要点】
栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。
对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为:
p->top==MAXNUM-1,栈满时,不能入栈;否则出现空间溢出,引起错误,这种现象称为上溢。
出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。
通常栈空作为一种控制转移的条件。
注意:
(1)顺序栈中元素用向量存放
(2)栈底位置是固定不变的,可设置在向量两端的任意一个端点
(3)栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶位置
【实现提示】
/*定义顺序栈的存储结构*/
typedefstruct{
ElemTypestack[MAXNUM];
inttop;
}SqStack;
/*初始化顺序栈函数*/
voidInitStack(SqStack*p)
{q=(SqStack*)malloc(sizeof(SqStack)/*申请空间*/)
/*入栈函数*/
voidPush(SqStack*p,ElemTypex)
{if(p->top {p->top=p->top+1;/*栈顶+1*/ p->stack[p->top]=x;}/*数据入栈*/ } /*出栈函数*/ ElemTypePop(SqStack*p) {x=p->stack[p->top];/*将栈顶元素赋给x*/ p->top=p->top-1;}/*栈顶-1*/ /*获取栈顶元素函数*/ ElemTypeGetTop(SqStack*p) {x=p->stack[p->top];} /*遍历顺序栈函数*/ voidOutStack(SqStack*p) {for(i=p->top;i>=0;i--) printf("第%d个数据元素是: %6d\n",i,p->stack[i]);} /*置空顺序栈函数*/ voidsetEmpty(SqStack*p) {p->top=-1;} 【参考程序】 #include #include #defineMAXNUM20 #defineElemTypeint /*定义顺序栈的存储结构*/ typedefstruct {ElemTypestack[MAXNUM]; inttop; }SqStack; /*初始化顺序栈*/ voidInitStack(SqStack*p) {if(! p) printf("Eorror"); p->top=-1; } /*入栈*/ voidPush(SqStack*p,ElemTypex) {if(p->top {p->top=p->top+1; p->stack[p->top]=x; } else printf("Overflow! \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("Underflow! \n"); return(0); } } /*获取栈顶元素*/ ElemTypeGetTop(SqStack*p) {ElemTypex; if(p->top! =0) {x=p->stack[p->top]; return(x); } else {printf("Underflow! \n"); return(0); } } /*遍历顺序栈*/ voidOutStack(SqStack*p) {inti; printf("\n"); if(p->top<0) printf("这是一个空栈! "); 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"); printf("第一次使用必须初始化! \n"); printf("\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); } 【思考与提高】 (1)读栈顶元素的算法与退栈顶元素的算法有何区别? (2)如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。 若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。 如何解决这个问题? 实验二: 栈的链式表示和实现 【实验内容与要求】 编写一个程序实现链栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化链栈 (2)链栈置空 (3)入栈 (4)出栈 (5)取栈顶元素 (6)遍历链栈 【知识要点】 链栈是没有附加头结点的运算受限的单链表。 栈顶指针就是链表的头指针。 注意: (1)LinkStack结构类型的定义可以方便地在函数体中修改top指针本身 (2)若要记录栈中元素个数,可将元素个数属性放在LinkStack类型中定义。 (3)链栈中的结点是动态分配的,所以可以不考虑上溢。 【实现提示】 typedefintElemtype; typedefstructstacknode{ Elemtypedata; stacknode*next; }StackNode; /*定义链栈*/ typedefstruct{ stacknode*top;//栈顶指针 }LinkStack; /*初始化链栈函数*/ voidInitStack(LinkStack*s) {s=(LinkStack*)malloc(sizeof(LinkStack));/*初始化申请空间*/ s->top=NULL;} /*链栈置空函数*/ voidsetEmpty(LinkStack*s) {s->top=NULL;} /*入栈函数*/ voidpushLstack(LinkStack*s,Elemtypex) {p=(StackNode*)malloc(sizeof(StackNode));//建立一个节点。 p->data=x; p->next=s->top;//指向栈顶。 s->top=p;//插入 } /*出栈函数*/ ElemtypepopLstack(LinkStack*s) {x=p->data; s->top=p->next;//当前的栈顶指向原栈的next free(p);//释放 } /*取栈顶元素函数*/ ElemtypeStackTop(LinkStack*s) {returns->top->data;} /*遍历链栈函数*/ voidDisp(LinkStack*s) {while(p! =NULL) {printf("%d\n",p->data); p=p->next; } } 【参考程序】 #include"stdio.h" #include"malloc.h" #include"stdlib.h" typedefintElemtype; 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; p=(StackNode*)malloc(sizeof(StackNode));//建立一个节点。 p->data=x; p->next=s->top;//由于是在栈顶pushLstack,所以要指向栈顶。 s->top=p;//插入 } /*出栈*/ ElemtypepopLstack(LinkStack*s) {Elemtypex; StackNode*p; p=s->top;//指向栈顶 if(s->to
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 顺序 结构 表示 实现 各种 基本 操作
![提示](https://static.bdocx.com/images/bang_tan.gif)