数据结构-栈、队列操作及考点

熟悉操作之前,我们需要先了解栈的特性,是先进后出,只能从栈顶入栈和出栈

顺序结构

利用数组一块连续的存储空间实现栈,需要一个变量来执行栈顶

#include <iostream>
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
//顺序存储方式,利用数据
#define MaxSize 50
typedef int ElementType;
typedef struct {
    ElementType data[MaxSize];
    int top;//执行栈顶的指针,存储栈顶的下标
}SqStack;
//初始化栈
void InitStack(SqStack &S){
    S.top=-1;//初始化栈顶指针
}
//判断栈是否为空
bool StackEmpty(SqStack S){
    if(S.top==-1){
        return true;
    }
    return false;
}
//进栈
bool Push(SqStack &S,ElementType x){
    //由于使用的是顺序存储,所以存储空间有限,需要判断栈是否满
    if(S.top+1==MaxSize) return false;
    S.data[++S.top]=x;//栈不满进栈,++S.top等价先赋值,再加1
    return true;
}
//出栈,根据栈的特性,所以出栈的时候需要从栈顶开始删除元素。
bool Pop(SqStack &S,ElementType &x)//将出栈的元素赋值给x
{
    if(StackEmpty(S)) return false;
    x=S.data[S.top--];//先出栈再-1
    return true;
}
//读取栈顶元素,不需要删除
bool GetTop(SqStack &S,ElementType &x){
    if(StackEmpty(S)) return false;
    x=S.data[S.top];
    return true;
}
int main (){
    SqStack s;
    InitStack(s);
    //插入一批元素
    int a;
    scanf("%d",&a);
    while (a!=999){
        if ( Push(s,a)){
            printf("入栈成功!!!");
        } else{
            printf("入栈失败!!!");
        }
        scanf("%d",&a);

    }
    printf("插入元素成功\n");
    int x;
    //依次出栈
    while (s.top!=-1){
        Pop(s,x);
        printf("%d",x);
    }
    return 0;
}

链式结构

可以使用不带头结点或带头结点的的单链表实现,需要一个头指针指向栈顶元素,在插入元素的时候只能使用头插法、删除元素的时候只能时候头指针后插法(从第一个元素开始删除)

栈的链式操作和单链表的操作及其相似(只需要注意插入和删除只能在第一个位置进行就行)

单链表的详细操作看之前这篇文章

单链表操作

考点

在考试的时候栈这块内容,经常考察的是给出已知的入栈顺序,要求考生能够判断出出栈顺序是否合法,这块其实大家注意栈的特性并且细心一点就可以做出来。

队列

队列也是一种操作受限的线性表,允许在一端进行插入,另一个进行删除。好比吃饭排队一样

队头(Front):允许删除的一端。

队尾(Rear):允许插入的一端。

顺序结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大磊程序员(“hello world”)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值