数据结构-栈和队列(一)栈

第二章线性表文章跳转链接
👍数据结构-线性表(一)概念及基本操作
下篇文章
👉数据结构-栈和队列(二)队列
👉数据结构-栈和队列(三)栈和队列的应用

本文详细介绍了栈的基本概念和基本操作;以及顺序栈和链式栈的实现代码。Let’s go!🏃‍♂️

数据结构

栈和队列(一)栈

思维导图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1 栈的基本概念

1、概念

栈(Stack) 是只允许在一端进行插入或删除操作的线性表

  • “先入后出”(FILO)原则

  • 栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。只允许进行插入和删除操作,允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)

  • 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除
    在这里插入图片描述

2、基本操作

线性表基本操作

InitList(&L): 初始化表。构造一个空的线性表L,分配内存空间。

DestroyList(&L): 销毁操作。销毁线性表,并释放线性表L所占用的内存空间。

ListInsert(&L,i,e): 插入操作。在表L中的第i个位置上插入指定元素e。

ListDelete(&L,i,&e): 删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。

LocateElem(L,e): 按值查找操作。在表L中查找具有给定关键字值的元素。

GetElem(L,i): 按位查找操作。获取表L中第i个位置的元素的值。

其他常用操作:

Length(L): 求表长。返回线性表L的长度,即L中数据元素的个数。

PrintList(L): 输出操作。按前后顺序输出线性表L的所有元素值。

Empty(L): 判空操作。若L为空表,则返回true,否则返回false。

栈的基本操作

InitStack(&S): 初始化栈。构造一个空栈 S,分配内存空间。

DestroyStack(&S):销毁栈。销毁并释放栈 S 所占用的内存空间。

Push(&S,x): 进栈,若栈S未满,则将x加入使之成为新栈顶。

Pop(&S,&x): 出栈,若栈S非空,则弹出栈顶元素,并用x返回。

GetTop(S, &x): 读栈顶元素。若栈 S 非空,则用 x 返回栈顶元素

其他常用操作:

StackEmpty(S): 判断一个栈 S 是否为空。若S为空,则返回true,否则返回false。

3、卡特兰数

在这里插入图片描述

2 顺序栈

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<windows.h>
#define MaxSize 10
using namespace std;

typedef struct{
    int data[MaxSize];  //静态数组存放栈中元素
    int top;  //栈顶指针
}SqStack;

/**
 * @description: 初始化栈
 * @param {SqStack} &S
 * @return {*}
 */
void initStack(SqStack &S) {
    S.top = -1;  //初始化栈顶指针
}

/**
 * @description: 判断栈是否空
 * @param {SqStack} S
 * @return {*}
 */
bool isEmpty(SqStack S) {
    return S.top == -1;
}

/**
 * @description: 判断栈是否满
 * @param {SqStack} S
 * @return {*}
 */
bool isFull(SqStack S) {
    return S.top == MaxSize - 1;
}

/**
 * @description: 入栈
 * @param {SqStack} &S
 * @param {int} e
 * @return {*}
 */
bool Push(SqStack &S, int e) {
    if (isFull(S))
        return false;
    S.top++;  //指针加一
    S.data[S.top] = e;  //入栈
    return true;    
}

/**
 * @description: 出栈
 * @param {SqStack} &S
 * @param {int} &e
 * @return {*}
 */
bool Pop(SqStack &S, int &e) {
    if(isEmpty(S))
        return false;
    e = S.data[S.top];
    S.top--;  
    return true;  
}

/**
 * @description: 取栈顶元素
 * @param {SqStack} S
 * @return {*}
 */
int GetTop(SqStack S) {
    if(isEmpty(S)) 
        return false;
    return S.data[S.top];
}

/**
 * @description: 输出栈
 * @param {SqStack} S
 * @return {*}
 */
void printStack(SqStack S) {
    if(isEmpty(S))
        return;
    for(int i = S.top; i >= 0; i--)
        cout << "stack[" << i  << "] = " << S.data[i] <<endl;
}
int main() {
    SqStack S; //初始化
    initStack(S); 
    bool loop = true;
    while (loop)
    {
        system("pause");
        system("cls");
        cout << "欢迎进行栈的操作,请按指定序号操作,考研顺利!" << endl;
        cout << "---------------------菜单---------------------" << endl;
        cout << "1、入栈" << endl;
        cout << "2、出栈" << endl;
        cout << "3、输出栈" << endl;
        cout << "4、查看栈顶元素" << endl;
        cout << "0、退出" << endl;
        int num;
        cout << "请选择序号:" ;
        cin >> num;
        switch (num)
        {
        case 1:
            if (isFull(S)) {
                cout << "栈满" << endl;
            } else {
                int e;
                cout << "请输入数据:" ;
                cin >> e;
                Push(S, e);
            }

                break;
        case 2:
            if (isEmpty(S))
            {
                cout << "栈空" << endl;
            }
            else
            {
                int e = -1;
                Pop(S, e);
                cout << "出栈的数据为:" << e << endl;
            }
            break;
        case 3:
            if(isEmpty(S))
                cout << "栈空" << endl;
            else
                printStack(S);
            break;
        case 4:
            if (isEmpty(S))
            {
                cout << "栈空" << endl;
            }else {
                cout << "栈顶的数据为: " << GetTop(S) << endl;
            }
            break;
        case 0:
            loop = false;
            break;
        case 6:

            break;
        default:
            break;
        }
        
    }
    return 0;
}

3 链表栈

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;

typedef struct LinkNode {
    int data;
    int length;
    LinkNode *next;
}*LinkStack;

/**
 * @description: 初始化栈
 * @param {LinkStack} &S
 * @return {*}
 */
bool initStack(LinkStack &S)
{
//    LinkStack *L; //初始化栈顶指针
   S = (LinkNode *)malloc(sizeof(LinkNode));
   if(S == NULL) 
     return false;
   S->next = NULL;
   S->length = 0;
   return true;
}

/**
 * @description: 判断栈是否空
 * @param {LinkStack} S
 * @return {*}
 */
bool isEmpty(LinkStack S)
{
    return S->next == NULL;
}


/**
 * @description: 入栈 -- 头插法
 * @param {LinkStack} &S
 * @param {int} e
 * @return {*}
 */
bool Push(LinkStack &S, int e)
{
    LinkNode *t;
    t = (LinkNode *)malloc(sizeof(LinkNode));
    t->data = e;
    if(isEmpty(S))
        t->length = 1;
    else
        t->length = S->next->length + 1;    
    t->next = S->next;
    S->next = t;   
    return true;
}

/**
 * @description: 出栈
 * @param {LinkStack} &S
 * @param {int} &e
 * @return {*}
 */
bool Pop(LinkStack &S, int &e)
{
    if (isEmpty(S))
        return false;
    LinkNode *p = S->next;    
    e = p->data;
    S->next = p->next;
    free(p);    
    return true;
}

/**
 * @description: 取栈顶元素
 * @param {LinkStack} S
 * @return {*}
 */
int GetTop(LinkStack S)
{
    if (isEmpty(S))
        return false;
    return S->next->data;
}

/**
 * @description: 输出栈
 * @param {LinkStack} S
 * @return {*}
 */
void printStack(LinkStack S)
{
    if (isEmpty(S))
        return;
    LinkNode *t = S->next;    
    while(t != NULL) {
        cout << "stack [" << t->length << "] = " << t->data << endl;
        t = t->next;
    }    
    
}

/**
 * @description: 获取链长
 * @param {LinkStack} S
 * @return {*}
 */
int GetLength(LinkStack S) {
    if(isEmpty(S))
        return 0;
    else
        return S->next->length;    
}
int main()
{
    LinkStack S; //初始化
    initStack(S);
    bool loop = true;
    while (loop)
    {
        cout << "\n" << endl;
        system("pause");
        system("cls");
        cout << "欢迎进行栈的操作,请按指定序号操作,考研顺利!" << endl;
        cout << "---------------------菜单---------------------" << endl;
        cout << "1、入栈" << endl;
        cout << "2、出栈" << endl;
        cout << "3、输出栈" << endl;
        cout << "4、查看栈顶元素" << endl;
        cout << "5、查看链长" << endl;
        cout << "0、退出" << endl;
        int num;
        cout << "请选择序号:";
        cin >> num;
        switch (num)
        {
        case 1:
        
            int e;
            cout << "请输入数据:";
            cin >> e;
            Push(S, e);
            break;
        case 2:
            if (isEmpty(S))
            {
                cout << "栈空" << endl;
            }
            else
            {
                int e = -1;
                Pop(S, e);
                cout << "出栈的数据为:" << e << endl;
            }
            break;
        case 3:
            if (isEmpty(S))
                cout << "栈空" << endl;
            else
                printStack(S);
            break;
        case 4:
            if (isEmpty(S))
            {
                cout << "栈空" << endl;
            }
            else
            {
                cout << "栈顶的数据为: " << GetTop(S) << endl;
            }
            break;
        case 5:
            cout << "链长为:" << GetLength(S) << endl;
            break;    
        case 0:
            loop = false;
            break;
        default:
            break;
        }
    }
    return 0;
}

程序效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

新的一章开启!加油👍

下篇文章-数据结构-栈和队列(二)队列
数据结构-栈和队列(二)队列🏃‍♂️

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值