1、数据结构实验报告栈和队列 实验三 栈和队列【实验目的】1、掌握栈的结构特性及其入栈,出栈操作;2、掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作。3、理解掌握递归调用程序设计思想。【实验学时】4学时【实验预习】回答以下问题:1、栈的顺序存储表示2、单链队列的存储表示3、循环队列的顺序存储表示 【实验内容和要求】1、按照要求完成程序exp3_1.c,实现顺序栈的相关操作。以下具有返回值的函数,若操作完成,返回OK,操作失败返回ERROR。函数需返回的其他数据,使用函数参数返回。调试及测试数据并给出结果: 初始化栈; 连续进栈3 ,5,7,9,13; 获取当前栈顶元素; 返回当
2、前栈长度; 判断当前栈是否为空; 栈内元素依次出栈; 判断当前栈是否为空; 清空栈; 利用栈实现数制转换,测试整数8和255; 判断表达式括号是否匹配,测试以下三个表达式:表达式1:1*(2+3)/4;表达式2:(3+4)*7-(8-9);表达式3:(1+2)*(3+4)-(5+6)*3)exp3_1.c部分代码如下:#include#include#include#define ERROR 0#define OK 1#define STACK_INT_SIZE 10 /*存储空间初始分配量*/#define STACKINCREMENT 5 /*存储空间分配增量*/typedef int E
3、lemType; /*定义元素的类型*/*(1)-补充栈的顺序存储分配表示,采用定长和可变长度存储均可*/typedef struct ElemType *base; ElemType *top; int stacksize;SqStack;int InitStack(SqStack *S); /*构造空栈*/int Push(SqStack *S,ElemType e); /*入栈*/int Pop(SqStack *S,ElemType *e); /*出栈*/int PopSq(SqStack *S);int GetTop(SqStack *S,ElemType *e); /*获取栈顶元素
4、*/int ClearStack(SqStack *S); /*清空栈*/int StackEmpty(SqStack *S); /*判断栈是否为空*/int StackLength(SqStack *S); /*求栈的长度*/void conversion(); /*十进制转换为二进制*/void Correct(); /*判断表达式括号是否匹配*/*(2)-初始化栈函数*/int InitStack(SqStack *S) S-base=(ElemType *)malloc(STACK_INT_SIZE*sizeof(ElemType); if(!S-base) return ERROR;
5、 S-top=S-base; S-stacksize=STACK_INT_SIZE; return OK;/*InitStack*/*(3)-入栈函数*/int Push(SqStack *S,ElemType e) if(S-top-S-base=S-stacksize) S-base=(ElemType *)realloc(S-base,(S-stacksize+STACKINCREMENT)*sizeof(ElemType); if(!S-base) return ERROR; S-top=S-base+S-stacksize; S-stacksize+=STACKINCREMENT;
6、*S-top+=e; return OK;/*Push*/*(4)-出栈函数*/int Pop(SqStack *S,ElemType *e) if(S-top=S-base) return ERROR; -S-top; *e=*S-top; return OK;/*Pop*/int PopSq(SqStack *S) if(S-top=S-base) return ERROR; -S-top; return OK;/*(5)-返回栈顶元素函数*/int GetTop(SqStack *S,ElemType *e) if(S-top=S-base) return ERROR; *e=*(S-t
7、op-1); return OK;/*GetTop*/*(6)-清空栈函数*/int ClearStack(SqStack *S) if(InitStack(S) printf(Init Success!); return OK; else printf(Init Fail!); return ERROR; /*ClearStack*/*(8)-判断栈是否为空*/int StackEmpty(SqStack *S) if(S-base=S-top) return OK; else return ERROR;/*StackEmpty*/*(9)-返回栈的长度函数*/int StackLength
8、(SqStack *S) return S-top-S-base;/*StackLength*/*(10)-十进制整数转换为二进制并输出函数*/void Conversion() int e; SqStack sq; InitStack(&sq); int count; printf(input count:); scanf(%d,&count); while(count!=0) Push(&sq,count%2); count=count/2; while(Pop(&sq,&e) printf(%d ,e); /*Conversion*/*(11)-判断表达式括弧是否匹配(假设只有一种小括弧
9、)函数*/void Correct() SqStack sqs; InitStack(&sqs); char a100,c; int i=0; printf(input :); while(c=getchar()!=n) ai+=c; for(i=0;istrlen(a);i+) if(ai=() Push(&sqs,ai); if(ai=) PopSq(&sqs); if(StackEmpty(&sqs) printf(OK!); else printf(error!); /*Correct*/*定义菜单字符串数组*/int menu_select() char *menu= n*MENU*
10、n, 1. Init Satckn, /*初始化顺序栈*/ 2. Push Elementn, /*入栈*/ 3. Get TopElementn, /*获得栈顶元素*/ 4. Return StackLengthn, /*返回栈的长度*/ 5. Stack IsEmptyn, /*判断是否栈空*/ 6. Pop Elementn, /*出栈*/ 7. Clear Stackn, /*清空栈*/ 8. Conversionn, /*利用栈进行数制转换*/ 9. Correctn, /*利用栈进行括号匹配*/ 0. Quitn, /*退出*/ n*MENU*n ; char s3; /*以字符形
11、式保存选择号*/ int c,i; /*定义整形变量*/ for (i=0; i11; i+) /*输出主菜单数组*/ printf(%s,menui); do printf(nEnter you choice(09):); /*在菜单窗口外显示提示信息*/ scanf(%s,s); /*输入选择项*/ c=atoi(s); /*将输入的字符串转化为整形数*/ while (c9); /*选择项不在09之间重输*/ return c; /*返回选择项,主程序根据该数调用相应的函数*/int main() SqStack ss; int e; InitStack(&ss); for (;) sw
12、itch (menu_select() case 1: printf(n1-Init Satck:n); if(InitStack(&ss) printf(Init OK!n); else printf(Init ERROR!n); break; case 2: printf(n2-Push Element:n); printf(input data(Terminated by inputing a character):); while(scanf(%d,&e)=1) if(Push(&ss,e) printf(Push %d OK!n,e); else printf(Push %d ERR
13、OR!n,e); printf(input data:(Terminated by inputing a character); getchar(); break; case 3: printf(n3-Get TopElement:n); if(GetTop(&ss,&e) printf(Top is %d,e); else printf(Stack is Empty!); break; case 4: printf(n4-Return StackLength:n); printf(StackLength is %d,StackLength(&ss); break; case 5: print
14、f(n5-Stack IsEmpty:n); if(StackEmpty(&ss) printf(Stack is Empty!); else printf(Stack is not Empty!); break; case 6: printf(n6-Pop Element:n); if(StackEmpty(&ss) printf(Stack is Empty!); else printf(All elements of Stack :); while(Pop(&ss,&e) printf(%d ,e); break; case 7: printf(n7-ClearStack:n); Cle
15、arStack(&ss); printf(ClearStack OK!); break; case 8: printf(n8-Conversion:n); Conversion(); break; case 9: printf(n9-Correct:n); getchar(); Correct(); break; case 0: exit(0); return 0;2、按照要求完成程序exp3_2.c,实现循环队列的相关操作。以下具有返回值的函数,若操作完成,返回OK,操作失败返回ERROR。函数需返回的其他数据,使用函数参数返回。调试及测试数据并给出结果: 初始化队列; 返回当前队列长度;
16、连续入队2,4,6,8,10; 获取当前队头元素; 返回当前队列长度; 判断当前队列是否为空; 队列元素依次出队; 判断当前队列是否为空;exp3_2.c部分代码如下:#include#include#define ERROR 0#define OK 1#define MAXQSIZE 100typedef int QElemType; /*定义元素的类型*/*(1)-循环队列顺序存储表示*/typedef struct QElemType *base; int front; int rear;SqQueue;/*(2)-构造一个空循环队列*/int InitQueue(SqQueue *Q)
17、 Q-base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType); if(!Q-base) return ERROR; Q-front=Q-rear=0; return OK;/*InitQueue*/*(3)-返回循环队列的长度*/int QueueLength(SqQueue *Q) return Q-rear - Q-front;/*QueueLentgh*/*(4)-入队操作*/int EnQueue(SqQueue *Q,QElemType e) if(Q-rear+1)%MAXQSIZE=Q-front) return ERROR; Q-
18、baseQ-rear=e; Q-rear=(Q-rear+1)%MAXQSIZE; return OK;/*EnQuese*/*(5)-出队操作*/int DeQueue(SqQueue *Q,QElemType *e) if(Q-front=Q-rear) return ERROR; *e=Q-baseQ-front; Q-front=(Q-front+1)%MAXQSIZE; return OK;/*DeQueue*/*(6)-判断队列是否为空*/int QueueEmpty(SqQueue *Q) if(Q-rear=Q-front) return OK; else return ERR
19、OR; /*QueueEmpty*/*(7)-取队头元素*/int GetHead(SqQueue *Q,QElemType *e) if(Q-rear = Q-front) /队列空的判断 return ERROR; *e = Q-baseQ-front; /将队头元素赋值给e Q-front = (Q-front + 1) % MAXQSIZE;/front指针向后一位置,若到最后,则转到数组头部 return OK;/*GetHead*/*销毁队列*/int DestroyQueue(SqQueue *Q) if(Q-base) Q-rear=Q-front=0; free(Q-base
20、); return OK;/*DestroyQueue*/*定义菜单字符串数组*/int menu_select() char *menu= n*MENU*n, 1. Init Queuen, /*初始化循环队列*/ 2. Get QueueLengthn, /*求队列的长度*/ 3. EnQueuen, /*入队操作*/ 4. Get Headn, /*取队头元素*/ 5. Queue IsEmptyn, /*判断是否队空*/ 6. DeQueuen, /*出队操作*/ 0. Quitn, /*销毁队列并退出*/ n*MENU*n ; char s3; int c,i; for (i=0;
21、i=8; i+) printf(%s,menui); do printf(nEnter you choice(06):); scanf(%s,s); c=atoi(s); while (c6); return c;/*主函数*/int main() SqQueue qq; int e; InitQueue(&qq); for (;) switch (menu_select() case 1: printf(n1-Init Queue:n); if(InitQueue(&qq) printf(Init OK!n); else printf(Init ERROR!n); break; case 2
22、: printf(n2-Get QueueLength:n); printf(Queue length is %d,QueueLength(&qq); break; case 3: printf(n3-EnQueue:n); printf(please input data:); scanf(%d,&e); if(EnQueue(&qq,e) printf(%d EnQueue OK!n,e); else printf(EnQueue Error!n); break; case 4: printf(n4-Get Head:n); if(GetHead(&qq,&e) printf(Head i
23、s %dn,e); else printf(Get Head Error!n); break; case 5: printf(n5-QueueEmpty:n); if(QueueEmpty(&qq) printf(Queue is Empty!); else printf(Queue is not Empty); break; case 6: printf(n6-DeQueue:n); printf(Queue is :); while(!QueueEmpty(&qq) if(DeQueue(&qq,&e) printf(%d ,e); break; case 0: DestroyQueue(
24、&qq); exit(0); return 0;3、递归(汉诺塔问题)利用递归算法程序设计编写程序exp3_3.c,解决n阶汉诺塔问题(A柱为起始,C柱为目的)。请将程序补充完整,并分别调试盘子数为3,7的情况。exp3_3.c部分代码如下:#includeint step=1;void hanoi(char A,int n,char B,char C) if (n=1) printf(第%d步:n,step+); printf(将%c柱子上唯一的1个盘子移到%c柱子!n,A,C); else printf(先将%c柱子上的多余的 %d个盘子移到%c柱子中过程:n,A,n-1,B) ; han
25、oi(A,_n-1_ ,C,_B_); printf(第%d步:n,step+); printf(将 %c 柱子上的最大的盘子移到 %c柱子中!n,A,C); printf(接下来将%c柱子上的%d个盘子移到 %c 柱子中过程:n, B,n-1,C) ; hanoi(B,_n-1_ ,A,_C_); int main() int n; char A,B,C; A=A; B=B; C=C; printf(输入A柱子上盘子的个数:); scanf(%d,&n); hanoi(A,n,B,C); printf(n移动结束); return 0;4、拓展实验:设计程序实现简单四则算术运算。要求说明:(1)从键盘接收算术表达式,以“#”表示接收结束;(2)输出算术表达式的值;(3)操作数仅限于非负整数,操作符只能是+、-、*、/、(、)(4)可以判断表达式的合法性(如括号的匹配)提示:借助栈来完成,将一个表达式转换为后缀表达式,并按照后缀表达式进行计算,得出表达式得结果。 【实验小结】
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1