第四次作业
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/qdu/DS2020/?page=2 |
|---|---|
| 这个作业要求在哪里 | |
| 这个作业的目标 | |
| 学号 | |
| 一、实验目的 | |
| 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 STACKINCREAMENT 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+STACKINCREAMENT)*sizeof(ElemType));
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREAMENT;
}
*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;
}
-
运行结果:
![]()
-
算法分析:因为主函数main()在输出2-Pop&Print时调用了PrintStack(&ss),这一函数内有Pop(SqStack *S,ElemType *e)函数,它执行了退栈操作;这体现的是栈这一结构只能在其一端进行操作,有先进后出的特点。
2、在第1题的程序中,编写一个十进制转换为二进制的数制转换算法函数(要求利用栈来实现),并验证其正确性。
- 实现代码:
void conveshen(SqStack *S) {
ElemType n,h;
int m=0,k=0;
InitStack(S);
printf("Input element\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;
conveshen(&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("creat a empty stack!\n");
sp=(stacknode *)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;
}
-
输入:2+((c-d)6-(f-7)a)/6
运行结果:
![]()
-
输入:a-((c-d)*6-(s/3-x)/2
运行结果:
![]()
-
程序的基本功能:
判断所输入多项式的左右括号是否配对。
四、实验小结
掌握了栈的结构特性及其入栈,出栈操作;掌握了队列的结构特性及其入队、出队的操作,掌握了循环队列的特点及其操作。




浙公网安备 33010602011771号