zoukankan      html  css  js  c++  java
  • 第四次作业

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

    实验二 栈和队列
    一、实验目的
    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!
    ");
       else{
            printf("Init Fail!
    ");
            return ERROR;
        }
        printf("input data:(Terminated by inputing a character)
    ");
        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("
    1-createStack
    ");
        CreateStack(&ss);
        printf("
    2-Pop&Print
    ");
        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 n;	
        printf("please input the number:",n);
        scanf("%d",&n);
        InitStack(&ss);
        conversion(&ss,n);
        PrintStack(&ss);
        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!
    ");
        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!
    ”);
    }
    
    int main()
    {
        char s[M];
        int i;
        stacknode *sp;
        printf("create a empty stack!
    ");
        sp=malloc(sizeof(stacknode));
        init(sp);
        printf("input a expression:
    ");
        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')'!
    ");
        else
            printf("'('not match')'!
    ");
        return 0;
    }
    

    输入:2+((c-d)6-(f-7)a)/6
    运行结果:

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

    程序的基本功能:

    判断表达式左右括号是否匹配

    以下为选做实验:
    4、设计算法,将一个表达式转换为后缀表达式,并按照后缀表达式进行计算,得出表达式得结果。
    实现代码

    5、假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点(不设队头指针),试编写相应的置空队列、入队列、出队列的算法。
    实现代码:

    四、实验小结
    学习了栈的特性,先进后出。还有包括入栈和出栈的操作。
    五、评语

  • 相关阅读:
    Vector-Constructors
    C++:多维数组的动态分配(new)和释放(delete)
    C++:多维数组的动态分配(new)和释放(delete)
    COM_利用GetWallpaper()获取墙纸路径
    COM_利用GetWallpaper()获取墙纸路径
    COM 技术相关概念
    COM 技术相关概念
    全排列与next_permutation
    全排列与next_permutation
    屏蔽MFC程序中的ESC键和ENTER键关闭窗口
  • 原文地址:https://www.cnblogs.com/suijunyao/p/13857437.html
Copyright © 2011-2022 走看看