第四次作业

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

一、实验目的

1、掌握栈的结构特性及其入栈,出栈操作;
2、掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作。

二、实验预习

说明以下概念

1、顺序栈:
  顺序栈是栈的顺序实现。顺序栈是指利用顺序存储结构实现的栈。采用地址连续的存储空间(数组)依次存储栈中数据元素,由于入栈和出栈运算都是在栈顶进行,而栈底位置是固定不变的,可以将栈底位置设置在数组空间的起始处;栈顶位置是随入栈和出栈操作而变化的,故需用一个整型变量top来记录当前栈顶元素在数组中的位置。
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?体现了栈的什么特性

  先入后出的特性

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

实现代码

int conversion(SqStack *S,int a){
    while(a){
        int e; 
        e=a%2;
        Push(S,e);
        a=a/2; 
    }
}

int main(){
    SqStack s; 
    int a;	
    printf("请输入十进制数字:");
    scanf("%d",&a);
    InitStack(&s);
    conversion(&s,a);
    PrintStack(&s);
    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=(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 @ 2020-10-20 22:16  NPCNP  阅读(138)  评论(0)    收藏  举报