1、实验报告3讲解数据结构上机实验报告实验三 栈和队列 班 级:13级计本二班 姓 名:杨宴强 学 号:201392130129实验三 栈和队列一、实验目的: 学习顺序栈的基本操作2.学习链栈的基本操作 3.学习循环队列基本操作 4.学习链队列基本操作二、实验内容:顺序栈的基本运算 2.链栈的基本操作 3.循环队列的基本运算 4.链队列的基本运算三、实验步骤及结果:1:顺序栈#includestdio.h#includestdlib.h#define MAXSIZE 20typedef struct char dataMAXSIZE;/栈中元素存储空间 int top;/栈顶指针SeqStack;
2、/顺序栈类型void Init_SeqStack(SeqStack *s)/顺序栈初始化 *s=(SeqStack*)malloc(sizeof(SeqStack);/在主函数中申请栈空间 (*s)-top=-1;/置栈空标志int Empty_SeqStack(SeqStack*s)/判断栈是否为空 if(s-top=-1)/栈为空时 return 1;/返回1 else return 0;/返回0void Push_SeqStack(SeqStack *s,char x)/顺序栈入栈 if(s-top=MAXSIZE-1)/判断是否栈满 printf(Stack is full!n);/栈
3、已满 else s-top+;/s指向下个节点 s-datas-top=x;/元素x压入栈*s中 void Pop_SeqStack(SeqStack *s,char *x)/将栈*s中的栈顶元素出栈并通过参数x返回给主调函数 if(s-top=-1)/栈空返回1 printf(Stack is empty!n);/栈为空 else *x=s-datas-top;/栈顶元素出栈 s-top-;/栈顶指针top-1 void Top_SeqStack(SeqStack *s,char *x)/取顺序栈栈顶元素 if(s-top=-1)/栈空返回1 printf(Stack is empty!n)
4、;/栈为空 else *x=s-datas-top;/取栈顶元素值 void print(SeqStack *s)/顺序栈输出 int i;/定义变量i for(i=0;itop;i+)/判断 printf(%4d,s-datai);/读入数据 printf(n);/输出栈void main() SeqStack *s;/定义指针s char x,*y=&x;/y是指向x的指针,出栈元素经过y传给变量x Init_SeqStack(&s);/顺序栈初始化 if(Empty_SeqStack(s)/判断栈是否为空 printf(Stack is empty!n); printf(Input da
5、ta of stack:n);/顺序栈元素入栈 scanf(%c,&x);/读入数据 while(x!=n)/对x的计数直到n结束 Push_SeqStack(s,x);/x入栈 scanf(%c,&x); printf(Output all data of stack:n);/提示 print(s);/输出顺序栈中的元素 Pop_SeqStack(s,y);/顺序栈元素出栈 printf(Output data of Pop stack:%cn,*y);/输出出栈元素 printf(Output all data of stack:n); print(s);/输出出栈后顺序栈中的元素 Top
6、_SeqStack(s,y);/读取顺序栈栈顶元素 printf(Output data of top stack:%cn,*y);/输出读出的栈顶元素 printf(Output all data of stack:n); print(s);/输出当前的顺序栈中的元素2链栈#include#includetypedef struct node char data; struct node*next;StackNode;/链栈元素类型void Init_LinkStack(StackNode*s)/链栈初始化 *s=NULL;int Empty_LinkStack(StackNode*s)/判
7、断链栈是否为空 if(s=NULL) return 1; else return 0;void Push_LinkStack(StackNode*top,char x)/链栈元素入栈 StackNode*p; p=(StackNode*)malloc(sizeof(StackNode);/生成存储空间 p-data=x; p-next=*top;/新生成的栈顶元素*p其后继为原栈顶元素*top *top=p;/栈顶指针*top指向新的栈顶元素*pvoid Pop_LinkStack(StackNode*top,char*x)/链栈元素出栈 StackNode*p; if(*top=NULL)
8、printf(Stack is empty!n);/栈空 else *x=(*top)-data;/栈顶元素经指针x传给对应的变量 p=*top; *top=(*top)-next; free(p); void print(StackNode*p)/链栈输出 while(p!=NULL) printf(%c,p-data); p=p-next; printf(n);void main() StackNode*s; char x,*y=&x;/出栈元素经指针y传给x Init_LinkStack(&s);/链栈初始化 if(Empty_LinkStack(s)/判断链栈是否为空 printf(S
9、tack is empty!n); printf(Input any string:n);/链栈元素入栈 scanf(%c,&x); while(x!=n) Push_LinkStack(&s,x); scanf(%c,&x); printf(Output string:n);/链栈输出 print(s); printf(Output stack:n); Pop_LinkStack(&s,y); /链栈元素出栈 printf(Element of Output stack is %cn,*y);/输出出栈元素 printf(Output string:n); print(s);/链栈输出3循环
10、队列#includestdio.h#includestdlib.h#define MAXSIZE 20typedef struct char dataMAXSIZE;/队头元素存储空间 int rear,front;/队尾和队头指针SeQueue;/顺序队列类型void Int_SeQueue(SeQueue*q)/置空队 *q=(SeQueue*)malloc(sizeof(SeQueue);/生成循环队列的存储空间 (*q)-front=0;/队尾与队头指针相等则为队空 (*q)-rear=0;int Empty_SeQueue(SeQueue*q)/判队空 if(q-front=q-re
11、ar)/判断是否队空 return 1;/队空 else return 0;/队不空void In_SeQueue(SeQueue*q,char x)/元素入队 if(q-rear+1)%MAXSIZE=q-front)/判断是否队满 printf(Queue is full!n);/队满,入队失败 else q-rear=(q-rear+1)%MAXSIZE;/队尾指针加1 q-dataq-rear=x;/将元素X入队 void Out_SeQueue(SeQueue*q,char*x)/元素出队 if(q-front=q-rear)/判断是否队空 printf(Queue is empty
12、);/队空,出队失败 else q-front=(q-front+1)%MAXSIZE;/队头指针加1 *x=q-dataq-front;/队头元素出对并由x返回队头元素值 void print(SeQueue*q)/循环队列输出 int i;/定义变量i i=(q-front+1)%MAXSIZE;/i入队 while(i!=q-rear)/判断队空 printf(%4cn,q-datai);/读入数据信息 i=(i+1)%MAXSIZE;/逐步累加 printf(%4cn,q-datai);/输出void main() SeQueue*q;/定义指针q char x,*y=&x;/出对元素
13、经指针y传给x Int_SeQueue(&q);/循环队列初始化 if(Empty_SeQueue(q)/判队空 printf(Queue is empty!n);/提示 printf(Input any string:n);/给循环队列输入元素 scanf(%c,&x); while(x!=n) In_SeQueue(q,x);/元素入队 scanf(%c,&x); printf(Output elements of Queue:n); print(q);/循环队列输出 printf(Output Queue:n); Out_SeQueue(q,y);/循环队列元素出队 printf(Ele
14、ment of Output Queue is %cn,*y);/输出出队元素 printf(Output elements of Queue:n); print(q);/输出出队后的循环队列元素4.链队列#includestdio.h#includestdlib.h#define MAXSIZE 30typedef struct node char data; struct node *next;QNode;/链队列结点类型typedef struct QNode *front,*rear;/将头、尾指针纳入到一个结构体的链队列LQueue;/链队列类型void Init_LQueue(LQ
15、ueue *q)/创建一个带头结点的空队列 QNode *p; *q=(LQueue*)malloc(sizeof(LQueue);/申请带头、尾指针的结点 p=(QNode*)malloc(sizeof(QNode);/申请链队列的头结点 p-next=NULL;/头结点的next指针置为空 (*q)-front=p;/队头指针指向头结点 (*q)-rear=p;/队尾指针指向头结点int Empty_LQueue(LQueue *q)/判队空 if(q-front=q-rear) return 1;/队为空 else return 0;void In_LQueue(LQueue *q,ch
16、ar x)/入队 QNode *p; p=(QNode*)malloc(sizeof(QNode);/申请新链队列结点 p-data=x; p-next=NULL;/新结点作为队尾结点时其next域为空 q-rear-next=p;/将新结点*p链到原队尾结点之后 q-rear=p;/是队尾指针指向新的队尾结点*pvoid Out_LQueue(LQueue *q,char *x)/出队 QNode *p; if(Empty_LQueue(q) printf(Queue is empty!n);/队空,出队失败 else p=q-front-next;/指针p指向队头结点 q-front-ne
17、xt=p-next;/头结点的next指针指向链队列的第二个数据结点 *x=p-data;/将删除的队头结点数据经由指针x返回 free(p); if(q-front-next=NULL)/出队后队为空,则置为空队列 q-rear=q-front; void print(LQueue *q)/链队列输出 QNode *p; p=q-front-next; while(p!=NULL) printf(%4c,p-data); p=p-next; printf(n);void main() LQueue *q; char x,*y=&x;/出队元素经指针y传给x Init_LQueue(&q);/
18、链队列初始化 if(Empty_LQueue(q)/判队空 printf(Queue is empty!n); printf(Input any string:n);/给链队列输入元素 scanf(%c,&x); while(x!=n) In_LQueue(q,x); scanf(%c,&x);/元素入队 printf(Output elements of Queue:n); print(q);/链队列输出 printf(Output Queue:n); Out_LQueue(q,y);/元素出队 printf(Element of Output Queue is %cn,*y);/输出出队的元素值 printf(Output elements of Queue:n); print(q);/输出出队后链队列的元素四、实验总结: 通过本次试验,了解了栈和队列的基本操作。从数据结构的定义看,栈和队列也是一种线性表。其与线性表的不同之处在于栈和队列的相关运算具有特殊性,只是线性表相关运算的一个子集。一般线性表的上的插入、删除运算不受限制,而栈和队列上的插入、删除运算受某种特殊限制。因此。栈和队列也称为操作受限的线性表。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1