第四次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/qdu/DS2020/
这个作业要求在哪里 https://edu.cnblogs.com/campus/qdu/DS2020/homework/11296
这个作业的目标 <掌握栈和队列的特性及相关操作,掌握循环队列的特点及操作>
学号 2018204093

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

二、实验预习
说明以下概念
1、顺序栈:
顺序栈是指利用顺序存储结构实现的栈。采用地址连续的存储空间(数组)依次存储栈中数据元素,由于入栈和出栈运算都是在栈顶进行,栈底位置固定不变。
2、链栈:
链式栈是一种数据存储结构,可以通过单链表的方式来实现。
3、循环队列:
循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。
4、链队
使用链表实现的队列;具有队头指针和队尾指针,指示队列元素所在的位置。

三、实验内容和要求
1、阅读下面程序,将函数Push和函数Pop补充完整。要求输入元素序列1 2 3 4 5 e,运行结果如下所示。


#include
#include
#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));
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题的程序中,编写一个十进制转换为二进制的数制转换算法函数(要求利用栈来实现),并验证其正确性。


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

运行结果:

3、阅读并运行程序,并分析程序功能。


#include
#include
#include
#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;
}

输入:2+((c-d)6-(f-7)a)/6

运行结果:

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

运行结果:

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

posted @ 2020-10-21 23:41  ritaaaaaaa  阅读(145)  评论(0)    收藏  举报