第四次作业 栈和队列

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

实验二 栈和队列
一、实验目的
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){
    
}/*Push*/

int Pop(SqStack *S,ElemType *e){
   
}/*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<bits/stdc++.h>
using namespace std;

#define maxsize 1000

struct Stack{
    int *base;      //栈底指针
    int *top;       //栈顶指针
    int stacksize;  //栈可用的最大容量
};

bool initstack(Stack &s){//构建空战
    s.base = new int[maxsize];      //为顺序栈分配一个最大容量为maxsize的数组空间
    if(!s.base)     exit(-1);       //存储分配失败
    s.top = s.base;                 //top初始为base, 空栈
    s.stacksize = maxsize;          //stacksize置为栈的最大容量maxsize
    return 1;
}

bool push(Stack &s, int e){
    //插入元素e为新的栈顶指针
    if(s.top - s.base >= s.stacksize){//栈满
        s.base = (int *)realloc(s.base, (s.stacksize + maxsize) * sizeof(int));
        if(!s.base) return 0;
            s.top = s.base + s.stacksize;
            s.stacksize += maxsize;
    }
    *s.top++ = e;
    return 1;
}

int pop(Stack &s, int &e){
    //返回栈顶元素, 不修改栈顶指针
    if(s.top != s.base)
        e = *--s.top;
    else return -1;
}

bool stackempty(Stack &s){
    if(s.top == s.base)
        return 0;
    return 1;
}

int main(){
    int a, e;
    Stack s;
    initstack(s);
    scanf("%d", &a);
    while(a){
        push(s, a%2);
        a = a/2;
    }
//    e = pop(s);
//        cout << e;
    while(stackempty(s)){
        pop(s, e);
        cout << e;
    }
    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=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-22 12:02  .刘小迪  阅读(260)  评论(0编辑  收藏  举报