收藏 分享(赏)

栈的操作(实验报告).doc

上传人:春华秋实 文档编号:3677249 上传时间:2018-11-15 格式:DOC 页数:23 大小:192.50KB
下载 相关 举报
栈的操作(实验报告).doc_第1页
第1页 / 共23页
栈的操作(实验报告).doc_第2页
第2页 / 共23页
栈的操作(实验报告).doc_第3页
第3页 / 共23页
栈的操作(实验报告).doc_第4页
第4页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、1实验三 栈和队列3.1 实验目的:(1) 熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现;(2) 熟悉队列的特点(先进先出)及队列的基本操作,如入队、出队等,掌握队列的基本操作在队列的顺序存储结构和链式存储结构上的实现。3.2 实验要求:(1) 复习课本中有关栈和队列的知识;(2) 用 C 语言完成算法和程序设计并上机调试通过;(3) 撰写实验报告,给出算法思路或流程图和具体实现(源程序) 、算法分析结果(包括时间复杂度、空间复杂度以及算法优化设想) 、输入数据及程序运行结果(必要时给出多种可能的输入数据和运行结果) 。3.3

2、 基础实验实验 1 栈的顺序表示和实现实验内容与要求:编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化顺序栈(2)插入元素(3)删除栈顶元素(4)取栈顶元素(5)遍历顺序栈(6)置空顺序栈分析:栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为:p-top= =MAXNUM-1,栈满时,不能入栈; 否则出现空间溢出,引起错误,这种现象称为上溢。出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空作为一种控制转移的条件。注意:(1)顺序栈中元素用向量存放(2)栈底位置是固定不

3、变的,可设置在向量两端的任意一个端点(3)栈顶位置是随着进栈和退栈操作而变化的,用一个整型量 top(通常称 top 为栈顶指针)来指示当前栈顶位置参考程序:#include#include2#define MAXNUM 20#define ElemType int/*定义顺序栈的存储结构*/typedef struct ElemType stackMAXNUM;int top;SqStack;/*初始化顺序栈*/void InitStack(SqStack *p) if(!p)printf(“Eorror“);p-top=-1;/*入栈*/void Push(SqStack *p,ElemT

4、ype x) if(p-toptop=p-top+1;p-stackp-top=x;elseprintf(“Overflow!n“);/*出栈*/ElemType Pop(SqStack *p) ElemType x;if(p-top!=0) x=p-stackp-top;printf(“以前的栈顶数据元素%d 已经被删除!n“,p-stackp-top);p-top=p-top-1;return(x);else printf(“Underflow!n“);return(0);/*获取栈顶元素*/ElemType GetTop(SqStack *p) ElemType x;if(p-top!=

5、0) x=p-stackp-top;return(x);else3 printf(“Underflow!n“);return(0);/*遍历顺序栈*/void OutStack(SqStack *p) int i;printf(“n“);if(p-toptop;i=0;i-)printf(“第%d 个数据元素是:%6dn“,i,p-stacki);/*置空顺序栈*/void setEmpty(SqStack *p)p-top= -1;/*主函数*/main() SqStack *q;int y,cord;ElemType a;doprintf(“n“);printf(“第一次使用必须初始化!n

6、“);printf(“n“);printf(“n 主菜单 n“);printf(“n 1 初始化顺序栈 n“);printf(“n 2 插入一个元素 n“);printf(“n 3 删除栈顶元素 n“);printf(“n 4 取栈顶元素 n“);printf(“n 5 置空顺序栈 n“);printf(“n 6 结束程序运行 n“);printf(“n-n“);printf(“请输入您的选择( 1, 2, 3, 4, 5,6)“);scanf(“%d“,printf(“n“);switch(cord) case 1: q=(SqStack*)malloc(sizeof(SqStack);In

7、itStack(q);OutStack(q);break;4case 2: printf(“请输入要插入的数据元素:a=“);scanf(“%d“,Push(q,a);OutStack(q);break;case 3: Pop(q);OutStack(q);break;case 4: y=GetTop(q);printf(“n 栈顶元素为:%dn“,y);OutStack(q);break;case 5: setEmpty(q);printf(“n 顺序栈被置空!n“);OutStack(q);break;case 6:exit(0);while (cordtop=NULL;printf(“n

8、 已经初始化链栈!n“);/*链栈置空*/void setEmpty(LinkStack * s) s-top=NULL;printf(“n 链栈被置空!n“);/*入栈*/void pushLstack(LinkStack * s, Elemtype x) StackNode * p;p=(StackNode *)malloc(sizeof(StackNode); /建立一个节点。p-data=x;p-next=s-top; /由于是在栈顶 pushLstack,所以要指向栈顶。s-top=p; /插入/*出栈*/Elemtype popLstack(LinkStack * s) Elemt

9、ype x;StackNode * p;p=s-top; /指向栈顶if (s-top =0) printf(“n 栈空,不能出栈!n“);exit(-1);x=p-data; s-top=p-next; /当前的栈顶指向原栈的 nextfree(p); /释放return x;6/*取栈顶元素*/Elemtype StackTop(LinkStack *s) if (s-top =0) printf(“n 链栈空n“);exit(-1);return s-top-data;/*遍历链栈*/void Disp(LinkStack * s) printf(“n 链栈中的数据为:n“);print

10、f(“=n“);StackNode * p;p=s-top;while (p!=NULL) printf(“%dn“,p-data);p=p-next;printf(“=n“);void main() printf(“= 链栈操作=nn“);int i,m,n,a;LinkStack * s;s=(LinkStack *)malloc(sizeof(LinkStack);int cord;do printf(“n“);printf(“第一次使用必须初始化!n“);printf(“n“);printf(“n 主菜单 n“);printf(“n 1 初始化链栈 n“);printf(“n 2 入栈

11、 n“);printf(“n 3 出栈 n“);printf(“n 4 取栈顶元素 n“);printf(“n 5 置空链栈 n“);printf(“n 6 结束程序运行 n“);printf(“n-n“);printf(“请输入您的选择( 1, 2, 3, 4, 5,6)“);scanf(“%d“,printf(“n“);switch(cord) case 1: InitStack(s);7Disp(s);break;case 2:printf(“输入将要压入链栈的数据的个数:n=“);scanf(“%d“,printf(“依次将%d 个数据压入链栈:n“,n);for(i=1;i#incl

12、ude #define MAXNUM 100#define Elemtype int#define TRUE 1#define FALSE 0typedef struct Elemtype queueMAXNUM;int front;int rear;sqqueue;/*队列初始化*/int initQueue(sqqueue *q) if(!q) return FALSE;q-front=-1;q-rear=-1;return TRUE;/*入队*/int append(sqqueue *q, Elemtype x) if(q-rear=MAXNUM-1) return FALSE;q-re

13、ar+;q-queueq-rear=x;9return TRUE;/*出队*/Elemtype Delete(sqqueue *q) Elemtype x;if (q-front=q-rear) return 0;x=q-queue+q-front;return x;/*判断队列是否为空*/int Empty(sqqueue *q) if (q-front=q-rear) return TRUE;return FALSE; /*取队头元素*/int gethead(sqqueue *q) if (q-front=q-rear) return 0;return(q-queueq-front+1)

14、; /*遍历队列*/void display(sqqueue *q) int s;s=q-front;if (q-front=q-rear)printf(“队列空!n“);elseprintf(“n 顺序队列依次为:“);while(srear)s=s+1;printf(“%dqueues);printf(“n“);printf(“顺序队列的队尾元素所在位置:rear=%dn“,q-rear);printf(“顺序队列的队头元素所在位置:front=%dn“,q-front);/*建立顺序队列*/void Setsqqueue(sqqueue *q) int n,i,m;printf(“n 请

15、输入将要入顺序队列的长度:“);scanf(“%d“,printf(“n 请依次输入入顺序队列的元素值:n“);for (i=0;i#include#define ElemType inttypedef struct Qnode ElemType data;struct Qnode *next;12Qnodetype;typedef struct Qnodetype *front;Qnodetype *rear;Lqueue;/*入链队列*/void Lappend(Lqueue *q,int x) Qnodetype *s; s=(Qnodetype*)malloc(sizeof(Qnode

16、type);s-data=x;s-next=NULL;q-rear-next=s;q-rear=s;/*初始化并建立链队列*/void creat(Lqueue *q) Qnodetype *h;int i,n,x;printf(“输入将建立链队列元素的个数:n= “);scanf(“%d“,h=(Qnodetype*)malloc(sizeof(Qnodetype);h-next=NULL;q-front=h;q-rear=h;for(i=1;ifront=q-rear) printf(“队列为空!n“);x=0;else p=q-front-next;q-front-next=p-next

17、;if(p-next=NULL)13q-rear=q-front;x=p-data;free(p);return(x);/*遍历链队列*/void display(Lqueue *q) Qnodetype *p; p=q-front-next; /*指向第一个数据元素节点 */printf(“n 链队列元素依次为:“);while(p!=NULL) printf(“%d“,p-data);p=p-next;printf(“nn 遍历链队列结束! n“);main() Lqueue *p;int x,cord;printf(“n*第一次操作请选择初始化并建立链队列!*n “);do printf

18、(“n 链队列的基本操作n “);printf(“=n“);printf(“ 主菜单 n“);printf(“=n“);printf(“ 1 初始化并建立链队列 n“);printf(“ 2 入链队列 n“);printf(“ 3 出链队列 n“);printf(“ 4 遍历链队列 n“);printf(“ 5 结束程序运行 n“);printf(“=n“);scanf(“%d“,switch(cord) case 1: p=(Lqueue *)malloc(sizeof(Lqueue);creat(p);display(p);break;case 2: printf(“请输入队列元素的值:x

19、=“);scanf(“%d“,Lappend(p,x);display(p);14break;case 3: printf(“出链队列元素:x=%dn“,Ldelete(p);display(p);break;case 4:display(p);break;case 5:exit (0);while (cord #include #define n1 10 #define n2 10 typedef struct node 15int x; /存 x 坐标int y; /存 Y 坐标int c; /存该点可能的下点所在的方向,1 表示向右,2 向上,3 向左,4 向右linkstack; li

20、nkstack top100; /迷宫矩阵int mazen1n2=1,1,1,1,1,1,1,1,1,1, 0,0,0,1,0,0,0,1,0,1, 1,1,0,1,0,0,0,1,0,1, 1,0,0,0,0,1,1,0,0,1, 1,0,1,1,1,0,0,0,0,1, 1,0,0,0,1,0,0,0,0,0, 1,0,1,0,0,0,1,0,0,1, 1,0,1,1,1,0,1,1,0,1, 1,1,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,; int i,j,k,m=0;main() /初始化 top,置所有方向数为左for(i=0;i“,topj.x

21、,topj.y);printf(“n“);/打印选出路径的迷宫for(j=0;j#include#include#define MAX 2 /*车库容量*/#define price 0.05 /*每车每分钟费用*/18typedef struct timeint hour;int min;Time; /*时间结点 */typedef struct nodechar num10;Time reach;Time leave;CarNode; /*车辆信息结点*/typedef struct NODECarNode *stackMAX+1;int top;SeqStackCar; /*模拟车站*/

22、typedef struct carCarNode *data;struct car *next;QueueNode;typedef struct NodeQueueNode *head;QueueNode *rear;LinkQueueCar; /*模拟通道*/void InitStack(SeqStackCar *); /*初始化栈*/ int InitQueue(LinkQueueCar *); /*初始化便道*/int Arrival(SeqStackCar *,LinkQueueCar *); /*车辆到达*/ void Leave(SeqStackCar *,SeqStackCar

23、 *,LinkQueueCar *); /*车辆离开*/void List(SeqStackCar,LinkQueueCar); /*显示存车信息*/ void main()SeqStackCar Enter,Temp;LinkQueueCar Wait;int ch;InitStack( /*初始化车站 */ InitStack( /*初始化让路的临时栈 */InitQueue( /*初始化通道 */while(1) printf(“n1. 车辆到达“);printf(“ 2. 车辆离开“);printf(“ 3. 列表显示“);printf(“ 4. 退出系统n“);while(1)sca

24、nf(“%d“,if(ch=1for(i=0;istacks-top=NULL;int InitQueue(LinkQueueCar *Q) /*初始化便道*/Q-head=(QueueNode *)malloc(sizeof(QueueNode);if(Q-head!=NULL)Q-head-next=NULL;Q-rear=Q-head;return(1);else return(-1);void PRINT(CarNode *p,int room) /*打印出站车的信息*/ int A1,A2,B1,B2;printf(“n 请输入离开的时间:/*:*/“);scanf(“%d:%d“,

25、printf(“n 离开车辆的车牌号为:“);puts(p-num);printf(“n 其到达时间为: %d:%d“,p-reach.hour,p-reach.min);printf(“离开时间为: %d:%d“,p-leave.hour,p-leave.min);A1=p-reach.hour;A2=p-reach.min;B1=p-leave.hour;B2=p-leave.min;printf(“n 应交费用为: %2.1f 元“,(B1-A1)*60+(B2-A2)*price);free(p);int Arrival(SeqStackCar *Enter,LinkQueueCar

26、*W) /*车辆到达*/ CarNode *p;QueueNode *t;p=(CarNode *)malloc(sizeof(CarNode);flushall();printf(“n 请输入车牌号(例:陕 A1234):“);gets(p-num);if(Enter-toptop+;printf(“n 车辆在车场第%d 位置.“,Enter-top);printf(“n 请输入到达时间:/*:*/“);20scanf(“%d:%d“,Enter-stackEnter-top=p;return(1);else /*车场已满,车进便道*/ printf(“n 该车须在便道等待!“);t=(Qu

27、eueNode *)malloc(sizeof(QueueNode);t-data=p;t-next=NULL; W-rear-next=t;W-rear=t;return(1); void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) /*车辆离开*/int i, room;CarNode *p,*t;QueueNode *q;/*判断车场内是否有车*/if(Enter-top0) /*有车*/ while(1) /*输入离开车辆的信息*/ printf(“n 请输入车在车场的位置/1-%d/:“,Enter-top)

28、;scanf(“%d“,if(room=1while(Enter-toproom) /*车辆离开*/Temp-top+;Temp-stackTemp-top=Enter-stackEnter-top;Enter-stackEnter-top=NULL;Enter-top-; p=Enter-stackEnter-top;Enter-stackEnter-top=NULL;Enter-top-;while(Temp-top=1)Enter-top+;Enter-stackEnter-top=Temp-stackTemp-top;Temp-stackTemp-top=NULL;Temp-top-;

29、PRINT(p,room);/*判断通道上是否有车及车站是否已满 */if(W-head!=W-rear)t=q-data;Enter-top+;printf(“n 便道的%s 号车进入车场第%d 位置.“,t-num,Enter-top);printf(“n 请输入现在的时间/*:*/:“);21scanf(“%d:%d“,W-head-next=q-next;if(q=W-rear) W-rear=W-head;Enter-stackEnter-top=t;free(q);else printf(“n 便道里没有车 .n“);else printf(“n 车场里没有车 .“); /*没车*

30、/ void List1(SeqStackCar *S) /*列表显示车场信息*/int i;if(S-top0) /*判断车站内是否有车 */printf(“n 车场:“);printf(“n 位置 到达时间 车牌号n“);for(i=1;itop;i+)printf(“ %d “,i);printf(“%d:%d “,S-stacki-reach.hour,S-stacki-reach.min);puts(S-stacki-num);else printf(“n 车场里没有车 “);void List2(LinkQueueCar *W) /*列表显示便道信息*/ QueueNode *p;

31、p=W-head-next;if(W-head!=W-rear) /*判断通道上是否有车*/printf(“n 等待车辆的号码为:“);while(p!=NULL)puts(p-data-num);p=p-next;else printf(“n 便道里没有车 .“); void List(SeqStackCar S,LinkQueueCar W)int flag,tag;flag=1;while(flag)printf(“n 请选择 1|2|3:“);printf(“n1.车场n2.便道n3.返回n“);while(1) scanf(“%d“,if(tag=1|tag=3) break;els

32、e printf(“n 请选择 1|2|3:“);switch(tag)case 1:List1(break; /*列表显示车场信息*/case 2:List2(break; /*列表显示便道信息*/case 3:flag=0;break;default: break; 3.5 思考题:(1)读栈顶元素的算法与退栈顶元素的算法有何区别?22(2)如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。如何解决这个问题?(3)栈的两种存储结构在判别栈空与栈满时,所依据的条件有何不同?(4)在程序中同时使用

33、两个以上的栈时,使用顺序栈共享邻接空间则很难实现,能否通过链栈来方便地实现?如何实现?(5)简述栈和队列的共同点和不同点。它们为什么属于线性表?(6)在顺序队列中,当队尾指针已经指向了队列的最后一个位置时,但事实上队列中可能还有空位置。此时若有元素入列,就会发生“假溢出”。如何解决这个问题?(7)链栈只有一个 top 指针,对于链队列,为什么要设计一个头指针和一个尾指针?(8)一个程序中如果要用到两个栈时,可通过两个栈共享一维数组来实现。即双向栈共享邻接空间。如果一个程序中要用到两个队列,能否实现?如何实现?假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意:不设头指针) ,试编写相应的队列初始化、入队列和出队列算法。(9) 设计算法实现括弧配对的检查。(10) 设计算法求解迷宫的一条最短路径。(11) 求解“背包问题” 。 “背包问题” 的基本描述是:有一个背包,能盛放的物品总重量为 S,设有 N 件物品,其重量分别为 w1,w2 ,.,wn,希望从 N 件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于 S 。23

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 规范标准 > 实验

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报