第4次作业
这个作业属于哪个课程 | 数据结构 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/qdu/DS2020/homework/11296 |
这个作业的目标 | 掌握栈的结构特性及其操作,队列的结构特性及其操作,循环队列的结构特性及其操作 |
学号 | 2018204106 |
一、实验目的
1、掌握栈的结构特性及其入栈,出栈操作;
2、掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作。
二、实验预习
说明以下概念
1、顺序栈:
栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。
2、链栈:
栈的链式存储结构称为链栈。
3、循环队列:
循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。
4、链队
队列的链式存储结构简称为链队列,它是限制仅在表头删除和表尾插入的单链表。
三、实验内容和要求
1、阅读下面程序,将函数Push和函数Pop补充完整。要求输入元素序列1 2 3 4 5 e,运行结果如下所示。
#include<stdio.h> #include<malloc.h> #define ERROR 0 #define OK 1 #define STACK_INT_SIZE 10 /*存储空间初始分配量*/ #define STACKINCREMENT 5 /*存储空间分配增量*/ typedef int ElemType; /*定义元素的类型*/ 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 CreateStack(SqStack *S); /*创建栈*/ void PrintStack(SqStack *S); /*出栈并输出栈中元素*/ int InitStack(SqStack *S){ S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType)); if(!S->base) return ERROR; S->top=S->base; S->stacksize=STACK_INT_SIZE; return OK; }/*InitStack*/ 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; } *S->top++=e; return OK;}/*Push*/ int Pop(SqStack *S,ElemType *e){ if(S->top!=S->base){ *e=*--S->top; return OK; } else return ERROR;}/*Pop*/ int CreateStack(SqStack *S){ int e; if(InitStack(S)) printf("Init Success!\n"); else{ printf("Init Fail!\n"); return ERROR; } printf("input data:(Terminated by inputing a character)\n"); while(scanf("%d",&e)) Push(S,e); return OK; }/*CreateStack*/ void PrintStack(SqStack *S){ ElemType e; while(Pop(S,&e)) printf("%3d",e); }/*Pop_and_Print*/ int main(){ SqStack ss; printf("\n1-createStack\n"); CreateStack(&ss); printf("\n2-Pop&Print\n"); PrintStack(&ss); return 0; }
算法分析:输入元素序列1 2 3 4 5,为什么输出序列为5 4 3 2 1?体现了栈的什么特性?
体现了栈是只允许在表的一端进行操作的线性表并且具有先进后出的特性。
2、在第1题的程序中,编写一个十进制转换为二进制的数制转换算法函数(要求利用栈来实现),并验证其正确性。
#include<stdio.h> #include<malloc.h> #define ERROR 0 #define OK 1 #define STACK_INT_SIZE 10 /*存储空间初始分配量*/ #define STACKINCREMENT 5 /*存储空间分配增量*/ typedef int ElemType; /*定义元素的类型*/ 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 CreateStack(SqStack *S); /*创建栈*/ void PrintStack(SqStack *S); /*出栈并输出栈中元素*/ void conversion(SqStack *S); int InitStack(SqStack *S){ S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType)); if(!S->base) return ERROR; S->top=S->base; S->stacksize=STACK_INT_SIZE; return OK; }/*InitStack*/ 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; } *S->top++=e; return OK; }/*Push*/ int Pop(SqStack *S,ElemType *e){ if(S->top!=S->base){ *e=*--S->top; return OK; } else return ERROR; }/*Pop*/ int CreateStack(SqStack *S){ int e; if(InitStack(S)) printf("Init Success!\n"); else{ printf("Init Fail!\n"); return ERROR; } printf("input data:(Terminated by inputing a character)\n"); while(scanf("%d",&e)) Push(S,e); return OK; }/*CreateStack*/ void PrintStack(SqStack *S){ ElemType e; while(Pop(S,&e)) printf("%3d",e); }/*Pop_and_Print*/ void conversion(SqStack *S) { ElemType n,h; int m=0,k=0; InitStack(S); printf("Input a number\n"); scanf("%d",&n); while(n) { m++; Push(S,n%2); n=n/2; } while(k<m) { k++; Pop(S,&h); printf("%d",h); } } int main() { SqStack S; conversion(&S); printf("\n"); return 0; }
3、阅读并运行程序,并分析程序功能。
#include<stdio.h> #include<malloc.h> #include<string.h> #define M 20 #define elemtype char typedef struct { elemtype stack[M]; int top; } stacknode; void init(stacknode *st); void push(stacknode *st,elemtype x); void pop(stacknode *st); void init(stacknode *st) { st->top=0; } void push(stacknode *st,elemtype x) { if(st->top==M) printf("the stack is overflow!\n"); else { st->top=st->top+1; st->stack[st->top]=x; } } void pop(stacknode *st) { if(st->top>0) st->top--; else printf(“Stack is Empty!\n”); } int main() { char s[M]; int i; stacknode *sp; printf("create a empty stack!\n"); sp=malloc(sizeof(stacknode)); init(sp); printf("input a expression:\n"); gets(s); for(i=0;i<strlen(s);i++) { if(s[i]=='(') push(sp,s[i]); if(s[i]==')') pop(sp); } if(sp->top==0) printf("'('match')'!\n"); else printf("'('not match')'!\n"); return 0; }
程序的基本功能:
来判断所输入多项式的左右括号是否配对.
实验小结
进一步了解了栈和队列的原理和功能。