【数据结构和算法5】栈和队列

本文详细介绍了栈和队列的基本概念、特点以及它们在实际问题中的应用案例。针对顺序栈和链栈的实现,提供了C++代码实现,包括初始化、入栈、出栈等操作。同时,对顺序队列和链队列的表示及操作进行了阐述,包括入队、出队等。这些内容对于理解数据结构和算法具有重要意义。
摘要由CSDN通过智能技术生成


一、栈和队列的的定义和特点

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.栈

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.队列

在这里插入图片描述
在这里插入图片描述

二、案例引入

1.栈的应用案例

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.队列的应用案例

在这里插入图片描述

三.栈的表示和实现

1.栈的数据同线性表。元素具有相同的类型,相邻元素具有前驱和后继的关系。
在这里插入图片描述在这里插入图片描述

1.顺序栈的表示和实现

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
两个指针相减是两个指针之间的差距,即差几个元素。(指向不同数组的指针是不能相减的)
在这里插入图片描述在这里插入图片描述

#include <iostream>
using namespace std;
#include "windows.h"
#define MAXSIZE 100
typedef int SElemType

//顺序栈的存储结构
typedef struct {
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;

//初始化
//当遇到 main 函数中的 return 语句时,C++ 程序将停止执行。但其他函数结束时,程序并不会停止。
//程序的控制将返回到函数调用之后的位置。然而,有时候会出现一些非常少见的情况,使得程序有必要在 main 以外的函数中终止。
//要实现这一点,可以使用 exit 函数。
//当调用 exit 函数时,无论是哪个函数包含了该调用,都将导致程序停止。
void InitStack(SqStack &S){
    S.base = new SElemType[MAXSIZE];
    if (!S.base) exit(EXIT_FAILURE);
    S.top = S.base;
    S.stacksize = MAXSIZE;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

//判断顺序栈是否为空
bool StackEmpty(SqStack S){
    if (S.top == S.base)
    {
        return -1;
    }
    else
        return 0;
}
//求顺序栈的长度
int StackLength(SqStack S)
{
    return S.top - S.base;
}

//清空顺序栈
int ClearStack(SqStack &S)
{
    if(S.base)
        S.top = S.base;
    return 0;
}

//销毁顺序栈
int DestroyStack(SqStack &S)
{
    if (S.base)
    {
        delete S.base;
        S.stacksize = 0;
        S.base = S.top = NULL;
    }
    return 0;
}

在这里插入图片描述

//入栈
int Push(SqStack &S, SElemType e)
{
    if(S.top - S.base == S.stacksize) return -1;
    //*S.top ++= e;
    *S.top = e;
    S.top++;
    return 0;
}

在这里插入图片描述

//出栈
int Pop(SqStack &S, SElemType &e)
{
    if (S.top == S.base) return -1;
    //e = *--S.top;
    S.top--;
    e = *S.top;
    return 0;
}

2.链栈的表示和实现

在这里插入图片描述在这里插入图片描述

//链栈的存储结构
typedef struct StackNode{
    SElemType data;
    struct StackNode * next;
}StackNode,*LinkStack;

//链栈的初始化
//链栈没有头结点
void InitLinkStack(LinkStack &S){
    S=NULL;
};

在这里插入图片描述
在这里插入图片描述

//链栈的入栈
int LinkPush(LinkStack &S, SElemType e){
    LinkStack p = new StackNode;
    p->data = e;
    p->next = S;
    S = p;
    return 0;
}

在这里插入图片描述

//链栈的出栈
int LinkPop(LinkStack &S, SElemType &e)
{
    if (S=NULL) return -1;
    e = S->data;
    LinkStack p = S;
    S = S->next;
    delete p;
    return 0;
}

在这里插入图片描述

//取栈顶元素
SElemType GetLinkTop(LinkStack S)
{
    if (S != NULL)
        return S->data;
}

四.栈和递归

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

五.队列的表示和实现

在这里插入图片描述在这里插入图片描述在这里插入图片描述

1.队列的循环顺序结构

在这里插入图片描述

//顺序队列的数据结构
typedef struct
{
    SElemType *base;  数组首元素的地址
    int front, rear;
}SQueue;
//初始化
void InitQueue(SQueue &Q)
{
    Q.base = new SElemType[MAXSIZE];
    if (!Q.base) exit(EXIT_FAILURE);
    Q.front = Q.rear = 0;
}

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

//求队列长度
int QueueLength(SQueue Q)
{
    cout << (Q.rear-Q.front) << endl;
    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}

在这里插入图片描述

//入队
void EnQueue(SQueue &Q, SElemType e)
{
    if((Q.rear+1)%MAXSIZE == Q.front) return;
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear+1)%MAXSIZE;
}

在这里插入图片描述在这里插入图片描述

//出队
void DEQueue(SQueue &Q, SElemType &e)
{
    if(Q.rear == Q.front) return;
    e = Q.base[Q.front];
    Q.front = (Q.front+1)%MAXSIZE;
}

2.队列的链式存储结构

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

//链队列的初始化
void InitLinkQueue(LinkQueue &Q)
{
    Q.front = new QNode;
    if (!Q.front) exit(EXIT_FAILURE);
    Q.front->data =0;
    Q.front->next = NULL;
    Q.rear = Q.front;
}

在这里插入图片描述

//链队的销毁
//从头结点开始,依次释放所有的结点
void DestroyLinkQueue(LinkQueue &Q)
{
    while (Q.front)
    {
        QueuePtr p = Q.front->next; //用Q.rear代替p也可以
        delete Q.front;
        Q.front = p;
    }
}

在这里插入图片描述

//链队列的入队
void EnListQueue(LinkQueue &Q, SElemType e)
{
    QueuePtr p = new QNode;
    if (!p) exit(EXIT_FAILURE);
    p->data = e;
    p->next = NULL;
    Q.rear->next = p;
    Q.rear = p;
    cout << Q.rear->data << endl;
}

在这里插入图片描述
在这里插入图片描述

//链队列出队
void DeLinkQueue(LinkQueue &Q, SElemType &e)
{
    if (Q.front == Q.rear) return;
    QueuePtr p = Q.front->next;
    e = p->data;
    Q.front->next = p->next;

    if (Q.rear == p) Q.rear = Q.front;
    delete p;
}

int main() {
    SetConsoleOutputCP(CP_UTF8);
    LinkQueue Q;
    SElemType e = 2;
    InitLinkQueue(Q);
    cout << Q.front->data << endl;

    EnListQueue(Q,e);
    cout << Q.rear->data << endl;

    return 0;
}


在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

姬霓钛美

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

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

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

打赏作者

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

抵扣说明:

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

余额充值