线性表、栈和队列——从零起步的数据结构学习日志2【极客BOY-米奇】

前言(转载请说明作者!)2020.3.13~3.29

3.13第一次修订

3.28~3.29第二次修订

本博主来自滨州学院信息工程学院2019级软件2班的一名Ordinary Student。
前面在学习日志Ⅰ中了解到,数据结构学习中的一些基本体系与一些结构。
这次的博客来记录一下关于线性表、栈和序列的一些细化知识,包括定义与一些具体的实现过程。

线性表

因需要,线性表的一些内容暂时不做博客叙述,等以后来续。

栈与队列的前言

栈和队列都属于线性表,但属于操作受限的线性表。

限定仅在表尾进行插入和删除操作的线性表

特点:后进先出:Last In First Out(LIFO)

假设模型(药盒)

可以假设栈是一个**药盒**,切面只能存放一枚药片,最多可以存放x粒,只能取出最上面的药片
假设x=5

药片1==(Top)==
药片2
药片3
药片4
药片5==(Bottom)==
底部封死

拿出药片的顺序为1->2->3->4->5
药盒:就是个现实意义上面的 “栈”

栈的操作名

名称意义
栈顶(Top)允许进行插入、删除操作的表尾端。(例如药盒里面的***药片1***)
栈底(Bottom)表头端。(例如药盒里面的药片5)
进栈/入栈(Push)栈的插入操作
退栈/出栈(Pop)栈的删除操作
空栈不含元素的空表

栈的抽象数据类型

栈的抽象数据类型:逻辑结构+基本运算

类型定义

ADT Stack{
数据对象:
D={ai | ai ∈ ElemSet, i = 1,2,…,n, n>=0}
数据关系:
R1={< ai-1 , ai> | ai-1, ai ∈ D, i=2,…,n}
约定an端为栈顶,a1端为栈底
基本操作:(省略)
}ADT Stack

基本操作方法名

  • InitStack(&S)初始化栈,构造一个空栈S
  • DestoryStack(&S)销毁栈,释放S占用的存储空间
  • StackLength(S)返回栈S的个数,即长度
  • StackEmpty(S)判断S是否为空,若为空返回栈,否则返回假
  • GetTop(S,&e)取栈S的栈顶元素,用e返回取到的元素
  • ClearStack(&s)将S清为空栈
  • Push(&S,e)进栈,插入元素e作为新的栈顶元素
  • Pop(&S,e)出栈,删除栈S的栈顶元素,用e返回其值
  • StackTravers(S,visit())对栈中的元素进行遍历

例题

在这里插入图片描述

  • A选项:

    (全部先入栈)1.e4(pop) 2.e3(pop) 3.e2(pop) 4.e1(pop);所以A 正确

  • B选项:

    1.e1(push) 2.e1(pop) 3.e2(push) 4.e2(pop) 5.e3(push) 6.e3(pop) 7.e4(push) 8.e4(pop);所以B 正确

  • C选项:

    1.e1,e2,e3(push) 2.e3(pop) 3.e4(push) 4.e4(pop);剩下的e1,e2只能以e2,e1的顺序出栈,所以C 错误

  • D选项:

    1.e1,e2(push) 2.e2(pop) 3.e3,e4(push) 4.e4(push) 5.e3(pop) 6.e1(pop);所以D 正确

答案即为:ABD

顺序栈的实现(仅供参考)

#include<stdio.h>
#include<stdlib.h>
#define MAXLENGTH 100

typedef int Status;
const Status OK=1;
const Status ERROR=0;
typedef int ElemType;

typedef struct{
    ElemType data[MAXLENGTH];
    int top;
}SqStack;

bool ListEmpty(SqStack st);
Status GetTopElem(SqStack st,ElemType &e);
Status Pop(SqStack &st,ElemType &e);

int main(){
    SqStack st;
    ElemType input,e;
    int i;
    printf("请输入若干整数,以0结束:\n");
    for(i=0;i<MAXLENGTH;i++){
        scanf("%d",&input);
        if(input!=0){
            st.data[i]=input;
        }else{
            break;
        }
    }
    st.top=i;

    if(GetTopElem(st,e)==OK){
        printf("取栈顶元素:%d\n",e);
    }else{
        printf("无栈顶元素!\n");
    }

    printf("栈是否为空:");
    if(ListEmpty(st)==true){
        printf("1\n");
    }else{
        printf("0\n");
    }

    printf("栈中元素的个数是:%d\n",st.top);

    printf("出栈结果:");
    for(;Pop(st,e)==OK;){
        printf("%4d",e);
    }

    printf("\n栈是否为空:");
    if(ListEmpty(st)==true){
        printf("1\n");
    }else{
        printf("0\n");
    }

    printf("栈中元素的个数是:%d\n",st.top);

    system("pause");
    return 0;
}
bool ListEmpty(SqStack st){
    if(st.top==0){
        return true;
    }
    return false;
}
Status GetTopElem(SqStack st,ElemType &e){
    if(ListEmpty(st)==true){
        return ERROR;
    }
    e=st.data[st.top-1];
    return OK;
}
Status Pop(SqStack &st,ElemType &e){
    if(ListEmpty(st)==true){
        return ERROR;
    }
    e=st.data[st.top-1];
    st.top--;
    return OK;
}

队列

假设模型(过桥)

可以假设队列的出入为过桥,上桥为入队列下桥为出队列,桥是单向行驶的。

假设三个人入队列

1
2
3
桥上:无人
  • 第一步

    2
    3
    桥上:1
  • 第二步

3
桥上:1 2
  • 第三步
桥上:1 2 3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客BOY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值