第四次作业

|这个作业属于哪个课程 |https://edu.cnblogs.com/campus/qdu/DS2020|
|这个作业要求在哪里 |https://edu.cnblogs.com/campus/qdu/DS2020/homework/11296|
|这个作业的目标 |了解掌握栈和队列|
|学号 |2018204291|
一、实验目的
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));
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
S->top++=e;
return 1;
}/
Push
/
int Pop(SqStack S,ElemType e){
if (S->top!=S->base)
{
e=--S->top;
return 1;
}else
return 0;
}/
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;
}
算法分析:栈具有现进后出的特性,且只能在一端进行操作
2、在第1题的程序中,编写一个十进制转换为二进制的数制转换算法函数(要求利用栈来实现),并验证其正确性。
实现代码

void conveshen (SqStack *S)
{ElemType n,h;
int m=0,k=O;
Initstack (S);
printf ("Input element \n");
scanf("%d" , &n);
while (n)
i 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;
}
验证
36
100100

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=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
运行结果:
2+((c-d)
6-(f-7)*a)/6
‘(‘match’)’!

输入:a-((c-d)6-(s/3-x)/2
运行结果:
a-((c-d)
6-s/(3-x))/2
‘‘not match’’!

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

四、实验小结
通过本次实验,对栈的结构特性及其入栈,出栈运行使用有了一定的掌握了解,对队列的结构特性有了一定的认识,并对入队、出队的操作有了一定的掌握,明白了循环队列的特点及其操作。

posted @ 2020-10-22 14:13  郭超帝  阅读(192)  评论(0编辑  收藏  举报