1、栈与队列的顺序表示和实现实验报告实验项目栈与队列的顺序表示和实现实验报告实验内容编写一个程序实现顺序栈和顺序队列的各种基本运算,并完成以下操作:1、初始化顺序队列;2、建立顺序队列;3、入队;4、出队;5、判断队列是否为空;6、取队头元素;7、遍历队列;8、初始化顺序栈;9、插入元素;10、删除栈顶元素;11、取栈顶元素;12、遍历顺序栈; 13、置空顺序栈;算法设计与程序实现:算法分析 1、对于顺序栈和顺序队列,都是采用一组地址连续的存储单元一次存放自栈底到栈顶或从队列头到队列尾的数据元素。 2、对于栈,设栈顶指针为top,栈底指针为base。用top=0或top=base表示栈空。对于队列
2、,设指针front为队列头指针,设指针rear表示队列尾指针。用front=rear=0表示空队列。 3、初始化栈和队列时,令top=0或front=rear=0,将栈或队列置空。 4、每入栈一个数据元素,指针top增加1,出栈时,指针top减小1。每当插入新的队尾数据元素时,指针rear增加1,每当删除一个队头数据元素时,指针front减小1。核心程序/顺序队列#include#include#include#define MAXNUM 100#define ElemType int #define TRUE 1#define FALSE 0 /定义队列的顺序存储结构typedef stru
3、ct 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-rear+; q-queueq-rear=x; return TRUE; /出队ElemType Delete(sqqueue *q) ElemType x; if(q-fr
4、ont=q-rear) printf(队列空!n);return 0; x=q-queue+q-front; printf(队头元素%d出队!n,x); return x; /判断队列是否为空int Empty(sqqueue *q)if(q-front=q-rear)return TRUE;return FALSE; /获取队头元素int gethead(sqqueue *q) ElemType x;if(q-front=q-rear)printf(队列空!n);return 0; x=q-queueq-front+1;printf(n队头元素:%d出队n,x); return x; /遍历
5、队 void display(sqqueue *q) int s; s=q-front; if(q-front=q-rear) printf(队列为空!n); else printf(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请输入顺序队列的长度:)
6、; scanf(%d,&n); printf(n请依次输入顺序队列的元素值:n); for(i=0;in;i+) scanf(%d,&m); append(q,m); /主函数 void main() sqqueue *head; int x,select; head=(squeue*)malloc(sizeof(squeue); printf(n第一次使用必须初始化!n); do printf(n*主菜单*n); printf(n 1 初始化队列 n); printf(n 2 建立顺序队列 n); printf(n 3 入队 n); printf(n 4 出队 n); printf(n 5
7、判断队列是否为空 n); printf(n 6 取队头元素 n); printf(n 7 遍历队列 n); printf(n 0 退出程序 n); printf(n*n); printf(n请选择操作:n); scanf(%d,&select); switch(select) case 1: initQueue(head); printf(已经初始化队列!n); break; case 2: Setsqqueue(head) printf(n已经建立队列!n); dispaly(head); break; case 3: printf(请输入队的值:n); scanf(%d,&x); appe
8、nd(head,x); dispaly(head); break; case 4: Delete(head); diapaly(head); break; case 5: if(Empty(head) printf(队列空!n); else printf(队列非空!n); break; case 6: gethead(head); break; case 7: dispaly(head); break; case 0: exit(0); while(select=7); /顺序栈#include#include#define MAXNUM 100#define ElemType int /定义
9、栈的顺序存储结构typedef struct ElemType stackMAXNUM; int top;SqStack;/初始化顺序栈void InitStack(SqStack *p) if(!p) printf(内存分配失败!); p-top= -1;/入栈void Push(SqStack *p,ElemType x) if(p-toptop=p-top+1; p-stackp-top=x; else printf(Overflow!n);/出栈ElemType Pop(SqStack *p) ElemType x; if(p-top=0) x=p-stackp-top; printf
10、(栈顶数据元素%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=0) x=p-stackp-top;printf(n栈顶元素为:%dn,x); return(x); else printf(Underflow!n); return(0); /遍历顺序栈 void OutStack(SqStack *p) int i; printf(n); if(p-topt
11、op;i=0;i-); printf(第%d个数据元素为:%6dn,i,p-stacki); /置空顺序栈 void setEmpty(SqStack *p) p-top=-1; /主函数 void main() SqStack *q; int cord;ElemType a; printf(第一次使用必须初始化!n); do 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
12、 结束程序运行 n); printf(n*n); printf(你选择的序号是(1,2,3,4,5,6); scanf(%d,&cord); switch(cord) case 1: q = (SqStack * )malloc(sizeof(SqStack); InitStack(q); OutStack(q); break; case 2: printf(请输入要插入的元素:a=); scanf(%d,&a); Push(q,a); OutStack(q); break; case 3: Pop(q); OutStack(q); break; case 4: GetTop(q); OutS
13、tack(q); break; case 5: setEmpty(q); printf(n顺序栈被置空!n); OutStack(q); break; case 6: exit(0); while(cord=6); 运行结果1、初始化书序栈2、3、入栈及出栈4、出栈及取栈顶元素5、6、初始化队列并输入顺序队列7、插入新的队尾元素,即入队8、删除队头数据元素,即出队9、判断队列是否为空。10、取队列头元素。11、遍历顺序队列。实验总结 此次实验,初步学会了建立顺序栈与顺序队列,并学会了栈和队列的基本算法,再次巩固了指针的用法。巩固了在课本上学的知识,加深了对栈和队列的认识与掌握。不过,在编程时,发觉自己在定义结构体和变量时,还有很多不足。而且,在编写程序时,自己有点粗心大意,经常忘记加“;”和“”等。路漫漫其修远兮,还得上下而求索啊!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1