第四次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/qdu/DS2020/?page=2
这个作业要求在哪里
https://edu.cnblogs.com/campus/qdu/DS2020/homework/11296
这个作业的目标
<掌握栈、队列的结构特性,掌握入栈、出栈、入队、出队及循环队列的操作>
学号
2018204231
一、实验目的
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
    运行结果:

  • 程序的基本功能:
    判断所输入多项式的左右括号是否配对。

四、实验小结
掌握了栈的结构特性及其入栈,出栈操作;掌握了队列的结构特性及其入队、出队的操作,掌握了循环队列的特点及其操作。

posted on 2020-10-20 21:07  赵洪玉  阅读(185)  评论(0)    收藏  举报

导航