用顺序结构表示栈并实现栈的各种基本操作.docx

上传人:牧羊曲112 文档编号:3659257 上传时间:2023-03-14 格式:DOCX 页数:15 大小:41.02KB
返回 下载 相关 举报
用顺序结构表示栈并实现栈的各种基本操作.docx_第1页
第1页 / 共15页
用顺序结构表示栈并实现栈的各种基本操作.docx_第2页
第2页 / 共15页
用顺序结构表示栈并实现栈的各种基本操作.docx_第3页
第3页 / 共15页
用顺序结构表示栈并实现栈的各种基本操作.docx_第4页
第4页 / 共15页
用顺序结构表示栈并实现栈的各种基本操作.docx_第5页
第5页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《用顺序结构表示栈并实现栈的各种基本操作.docx》由会员分享,可在线阅读,更多相关《用顺序结构表示栈并实现栈的各种基本操作.docx(15页珍藏版)》请在三一办公上搜索。

1、用顺序结构表示栈并实现栈的各种基本操作栈的顺序表示和实现 2.2基础实验 2.2.1实验目的 掌握栈的顺序表示和实现 掌握栈的链式表示和实现 掌握队列的顺序表示和实现 掌握队列的链式表示和实现 2.2.2实验内容 实验一:栈的顺序表示和实现 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: 初始化顺序栈 插入元素 删除栈顶元素 取栈顶元素 遍历顺序栈 置空顺序栈 栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。 对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为:p-top= =MAXNUM-1,栈满时,不能入栈;否则出现空间溢出,引起错误,这种现象称为上

2、溢。 出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空作为一种控制转移的条件。 注意: 顺序栈中元素用向量存放 栈底位置是固定不变的,可设置在向量两端的任意一个端点 栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top来指示当前栈顶位置 /*定义顺序栈的存储结构*/ typedef struct ElemType stackMAXNUM; int top; SqStack; /*初始化顺序栈函数*/ void InitStack(SqStack *p) q=(SqStack*)malloc(sizeof(SqStack) /*申请空间*/) /*入栈函数*/ v

3、oid Push(SqStack *p,ElemType x) if(p-toptop=p-top+1; /*栈顶+1*/ p-stackp-top=x; /*数据入栈*/ /*出栈函数*/ ElemType Pop(SqStack *p) x=p-stackp-top; /*将栈顶元素赋给x*/ p-top=p-top-1; /*栈顶-1*/ /*获取栈顶元素函数*/ ElemType GetTop(SqStack *p) x=p-stackp-top; /*遍历顺序栈函数*/ void OutStack(SqStack *p) for(i=p-top;i=0;i-) printf(第%d个

4、数据元素是:%6dn,i,p-stacki); /*置空顺序栈函数*/ void setEmpty(SqStack *p) p-top= -1; #include #include #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,E

5、lemType 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(以前的栈顶数据元素%d已经被删除!n,p-stackp-top); p-top=p-top-1; return(x); else printf(Underflow!n); return(0); /*获取栈顶元素*/ ElemType GetTop(SqStack *p) ElemType x;

6、 if(p-top!=0) x=p-stackp-top; return(x); else 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; do printf(n); prin

7、tf(第一次使用必须初始化!n); 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,&cord); printf(n); switch(cord) case 1: q=(SqStack*)malloc(sizeof(Sq

8、Stack); 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: 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

9、 (cordtop=NULL; /*链栈置空函数*/ void setEmpty(LinkStack * s) s-top=NULL; /*入栈函数*/ void pushLstack(LinkStack * s, Elemtype x) p=(StackNode *)malloc(sizeof(StackNode); /建立一个节点。 p-data=x; p-next=s-top; /指向栈顶。 s-top=p; /插入 /*出栈函数*/ Elemtype popLstack(LinkStack * s) x=p-data; s-top=p-next; /当前的栈顶指向原栈的next fre

10、e(p); /释放 /*取栈顶元素函数*/ Elemtype StackTop(LinkStack *s) return s-top-data; /*遍历链栈函数*/ void Disp(LinkStack * s) while (p!=NULL) printf(%dn,p-data); p=p-next; #include stdio.h #include malloc.h #include stdlib.h typedef int Elemtype; typedef struct stacknode Elemtype data; stacknode * next; StackNode; t

11、ypedef struct stacknode * top; /栈顶指针 LinkStack; /*初始化链栈*/ void InitStack(LinkStack * s) s-top=NULL; printf(n已经初始化链栈!n); /*链栈置空*/ void setEmpty(LinkStack * s) s-top=NULL; printf(n链栈被置空!n); /*入栈*/ void pushLstack(LinkStack * s, Elemtype x) StackNode * p; p=(StackNode *)malloc(sizeof(StackNode); /建立一个节

12、点。 p-data=x; p-next=s-top; /由于是在栈顶pushLstack,所以要指向栈顶。 s-top=p; /插入 /*出栈*/ Elemtype popLstack(LinkStack * s) Elemtype x; StackNode * p; p=s-top; /指向栈顶 if (s-top =0) printf(n栈空,不能出栈!n); exit(-1); x=p-data; s-top=p-next; /当前的栈顶指向原栈的next free(p); /释放 return x; /*取栈顶元素*/ Elemtype StackTop(LinkStack *s) i

13、f (s-top =0) printf(n链栈空n); exit(-1); return s-top-data; /*遍历链栈*/ void Disp(LinkStack * s) printf(n链栈中的数据为:n); printf(=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)

14、; int cord; do printf(n); printf(第一次使用必须初始化!n); 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,&cord); printf(n); switch(cord) case 1: InitStac

15、k(s); Disp(s); break; case 2: printf(输入将要压入链栈的数据的个数:n=); scanf(%d,&n); printf(依次将%d个数据压入链栈:n,n); for(i=1;i=n;i+) scanf(%d,&a); pushLstack(s,a); Disp(s); break; case 3: printf(n出栈操作开始!n); printf(输入将要出栈的数据个数:m=); scanf(%d,&m); for(i=1;i=m;i+) printf(n第%d次出栈的数据是:%d,i,popLstack(s); Disp(s); break; case

16、4: printf(nn链栈的栈顶元素为:%dn,StackTop(s); printf(n); break; case 5: setEmpty(s); Disp(s); break; case 6: exit(0); while (cordfront=-1; q-rear=-1; /*入队函数*/ int append(sqqueue *q, Elemtype x) q-rear+; q-queueq-rear=x; /*出队函数*/ Elemtype Delete(sqqueue *q) x=q-queue+q-front; /*判断队列是否为空函数*/ int Empty(sqqueue

17、 *q) if (q-front=q-rear) return TRUE; /*取队头元素函数*/ int gethead(sqqueue *q) return(q-queueq-front+1); /*遍历队列函数*/ void display(sqqueue *q) while(srear) s=s+1; printf(%dqueues); /*建立顺序队列函数*/ void Setsqqueue(sqqueue *q) for (i=0;in;i+) /*利用循环快速输入数据*/ scanf(%d,&m); append(q,m); /*利用入队函数快速输入数据*/ #include #

18、include #define MAXNUM 100 #define Elemtype int #define TRUE 1 #define FALSE 0 typedef 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)

19、 return FALSE; q-rear+; q-queueq-rear=x; return 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) retu

20、rn 0; return(q-queueq-front+1); /*遍历队列*/ 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(s

21、qqueue *q) int n,i,m; printf(n请输入将要入顺序队列的长度:); scanf(%d,&n); printf(n请依次输入入顺序队列的元素值:n); for (i=0;in;i+) scanf(%d,&m); append(q,m); main sqqueue *head; int x,y,z,select; head=(sqqueue*)malloc(sizeof(sqqueue); doprintf(n第一次使用请初始化!n); printf(n请选择操作(1-7):n); printf(=n); printf(1初始化n); printf(2建立顺序队列n);

22、printf(3入队n); printf(4出队 n); printf(5判断队列是否为空n); printf(6取队头元素 n); printf(7遍历队列n); printf(=n); scanf(%d,&select); switch(select) case 1: initQueue(head); printf(已经初始化顺序队列!n); break; case 2: Setsqqueue(head); printf(n已经建立队列!n); display(head); break; case 3: printf(请输入队的值:n ); scanf(%d,&x); append(head,x); display(head); break; case 4: z=Delete(head); printf(n队头元素%d已经出队!n,z); display(head); break; case 5: if(Empty(head) printf(队列空n); else printf(队列非空n); break; case 6: y=gethead(head); printf(队头元素为:%dn,y); break; case 7: display(head); break; while(select=7);

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号