实验二 栈和队列

 

 
这个作业属于哪个课程https://edu.cnblogs.com/campus/qdu/DS2020
这个作业要求在哪里 https://edu.cnblogs.com/campus/qdu/DS2020/homework/11296
这个作业的目标 <栈和队列>
学号 2018204137

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

二、实验预习
说明以下概念
1、顺序栈:栈的顺序存储结构。

2、链栈:栈的链式存储结构。

3、循环队列:首尾相连的顺序队列。

4、链队:队列的链式存储结构

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

实现代码

#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 5
typedef int SElemType;
typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;
int InitStack(SqStack &S);
int CreateStack(SqStack *S);
int GetTop(SqStack S,SElemType &e);
int Push(SqStack &S, SElemType e);
int Pop(SqStack &S, SElemType &e);
void conversion();
void main()
{
    int e;
    SqStack S;
    CreateStack(S);
    GetTop( S, e);
    Push( S, e);
    conversion();
}
int InitStack(SqStack &S)
{
   S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
   if(!S.base)return ERROR;
   S.top=S.base;
   S.stacksize=STACK_INIT_SIZE;
}
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;
}
int GetTop(SqStack S,SElemType &e)
{
    if(S.top==S.base)  return ERROR;
    e=*(S.top-1);
    return OK;
}
int Push(SqStack &S,SElemType e)
{
    if(S.top-S.base>=S.stacksize)
    {
     S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof (SElemType));
        if(!S.base)return ERROR;
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
     }
}
int Pop(SqStack &S,SElemType &e)
{
    if(S.top==S.base)return ERROR;
    e=*--S.top;
    return 0K;
}
void conversion()
{
    int n,e;
    SqStack S;
    printf("input data:\n");
    scanf("%d",n);
    while(n)
    {
        Push(S,n);
        n=n/2;
     }
        Pop(S,e);
        printf("%d",e);
}

验证

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
运行结果:

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

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

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

posted @ 2020-10-20 21:38  汶姬秃了没  阅读(308)  评论(0)    收藏  举报