第四次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/qdu/DS2020/
这个作业要求在哪里 https://edu.cnblogs.com/campus/qdu/DS2020/homework/11296
这个作业的目标 掌握栈的结构特性及其入栈,出栈操作;掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作
学号 2018204187

一、实验目的
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) return ERROR;
	S->top=--S->top;
	*e=*S->top;
	return OK;
}/*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?体现了栈的什么特性?
因为栈是限制在表的一端进行插入和删除运算的线性表,所以每次退栈的总是当前栈中最新的元素,即最后插入的元素,而最先插入的是被放在栈的底部,要到最后才能才能删除。所以最后结果是 5 4 3 2 1;提现了栈的后进先出的特点。

2、在第1题的程序中,编写一个十进制转换为二进制的数制转换算法函数(要求利用栈来实现),并验证其正确性。
实现代码

int conversion(SqStack *S,int a){
	while(a){
		int e; 
		e=a%2;
		Push(S,e);
		a=a/2; 
	}
}
int main(){
    SqStack ss; 
    int a;	
    printf("please input the number:",a);
    scanf("%d",&a);
    InitStack(&ss);
    conversion(&ss,a);
    PrintStack(&ss);
    return 0;
}  

验证:

三、实验内容和要求
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) return ERROR;
	S->top=--S->top;
	*e=*S->top;
	return OK;
}/*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;
}  

输入:a-((c-d)*6-(s/3-x)/2

判断多项式的左右括号是否配对.

四,实验小结:更好地掌握了栈的结构特性及其入栈,出栈操作,队列的结构特性及其入队、出队的操作,循环队列的特点及其操作;
对栈和队列有了更深的理解,对程序代码的实现有了一个更为全面深刻的认识。

posted @ 2020-10-21 13:59  拥抱星星的月亮  阅读(89)  评论(0编辑  收藏  举报