文章目录

  • 前言
  • 一、栈的定义
  • 二、顺序栈
  • 三、两栈共享空间
  • 四、链栈
  • 总结

前言


提示:以下是本篇文章正文内容

一、栈的定义

栈(Stack)是受操作限制的线性表,插入和删除数据元素的操作只能在线性表的一段进行。

栈一般有栈底和栈顶,stack是限定仅在表尾进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端称为栈底

栈又称为后进先出的线性表,简称LIFO结构
栈的插入操作,为压栈、入栈;栈的删除操作,为出栈

入栈(Push)
数据元素进入栈内

出栈(Pop)
栈内元素从栈顶弹出

二、顺序栈

顺序栈:栈的顺序存储结构
顺序栈是用数组来实现的,并将下标位0的作为栈底
附设指针top指示栈顶元素在数组中的位置

顺序栈的结构

typedef int SElemType;//SElemType类型根据实际情况来定
/* 顺序栈结构 */
typedef struct
{SElemType data[MAXSIZE];int top;   //用于栈顶指针
}SqStack;

进栈操作

/*进栈操作 插入元素e为新的栈顶元素*/
Status Push(SqStack *S,SElemType e)
{if(S->top == MAXSIZE -1) /*栈满*/{return ERROR;}S->top++; /*栈顶指针增加一*/S->data[S->top] = e; /*将新插入元素赋值给栈顶空间*/return OK;
}

出栈操作

/*出栈操作:若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
Status Pop(SqStack *S,SElemType *e)
{if(S->top == -1)return ERROR;*e=S->data[S->top]; /*将要删除的栈顶元素赋值给e*/S->top--; /*栈顶指针减一*/return OK;
}

三、两栈共享空间

对于相同数据类型的栈,可以用一个数组来存储,让一个栈的栈底为数组的始端,即下标为0处,另一个栈的栈底为数组的末端,即下标为数组长度n-1处。两个栈如果增加元素,就是两端点向中间延伸。

top1和top2分别为两个栈的栈顶指针

top1+1=top2(栈满);栈1为空栈,top1=-1;栈2为空栈,top2=n;
共享栈结构

/*两栈共享空间结构*/
typedef struct
{SElemType data[MAXSIZE];int top1; /*栈1栈顶指针*/int top2; /*栈2栈顶指针*/
}SqDoubleStack;

入栈操作
这里要判断是栈1还是栈2的栈号参数stacklNumber

//插入元素e为新的栈顶元素
Status Push(SqDoubleStack *S,SElemType e, int stacklNumber)
{if(S->top1+1==S->top2) /*栈满*/return ERROR;if(stacklNumber==1)  /*若栈1有元素进栈*/S->data[++S->top1] = e; /*若栈1给top1+1后给数组元素赋值*/else if (stacklNumber ==2)/*若栈2有元素进栈*/S->data[--S->top2]=e; /*若栈2给top2-1后给数组元素赋值*/return OK;
}

出栈操作

/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
Status Pop(SqDoubleStack *S,SElemType *e, int stackNumber)
{if (stackNumber == 1) {if (S->top1 == -1)  /*空栈,溢出*/return ERROR;*e = S->data[S->top1--]; /*栈1的栈顶元素出栈*/}if (stackNumber == 2){if(S->top2==MAXSIZE)  /*空栈,溢出*/return ERROR;*e = S->data[S->top2++]; /*栈2的栈顶元素出栈*/}
}

四、链栈

链栈:栈的链接存储结构

将单链表的头部作为栈顶,链栈不需要附设头节点

链栈的结构

//结点
typedef struct StackNode
{ElemType data;struct StackNode *next;
}StackNode, *LinkStackPtr;typedef struct LinkStack
{LinkStackPtr top;  //栈顶指针int count
}LinkStack;

进栈操作

//进栈操作:单链表有头指针,而栈顶指针也是必须的,因此把栈顶放在单链表的头部
//(头结点->栈顶):相当于头插法;插入新元素e为新的栈顶元素
Status Push(LinkStack *S,SElemType e)
{LinkStackPtr s=(LinkStackPtr) malloc(sizeof(StackNode)); /*声明新结点*/s->data = e;s->next = S->top;  /*把当前的栈顶元素赋值给新结点的直接后继*/S->top = s;  /*将新的结点s赋值给栈顶指针*/S->count++;return OK;
}

出栈操作

/*出栈操作:用p存储被删除的栈顶结点,将栈顶指针下移一位,最后释放p*/
#include <stdbool.h>
bool StackEmpty(LinkStack S)
{if(S.top ==NULL) /*如果是空栈,则top为*/return TRUE;
}
Status Pop(LinkStack *S,SElemType *e)
{LinkStackPtr p;if (StackEmpty(*S))return ERROR;*e = S->top->data;p = S->top;S->top = S->top->next;free(p);S->count--;return OK;
}


总结

提示:这里对文章进行总结:

如果栈的使用过程中元素变化不可预料,有时小,有时大,建议用链栈,反之,如果它的变化在可控范围内,建议用顺序栈。

栈的基本操作(C/C++)相关推荐

  1. 数据结构源码笔记(C语言):栈的基本操作

    #include <stdio.h> #define MaxSize 100typedef char ElemType;typedef struct {char stack[MaxSize ...

  2. sdut 3335 数据结构实验之栈与队列八:栈的基本操作

    数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descri ...

  3. c++:栈的基本操作+实例:迷宫求解

    栈的基本操作+实例:迷宫求解 #include<iostream> using namespace std;struct Node {int datai;int dataj;Node* n ...

  4. python 链栈及基本操作

    链栈,即用链表实现栈存储结构 链栈的实现思路同顺序栈类似,顺序栈是将顺序表(数组)的一端作为栈低,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈低,如图1所示: 将链表头部作为栈顶 ...

  5. 二叉树和栈的基本操作

    二叉树和栈的基本操作 Tree.h: #pragma once#define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include < ...

  6. 数据结构-“栈”的基本操作

    栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出 ...

  7. 重学数据结构004——栈的基本操作及实现(数组实现)

    上文提到过栈以及栈的基本操作.上文中是基于链表做的实现.但是这种方法会出现大量的malloc()和free()操作,这种开销是非常昂贵的. 另外一种实现方式是基于数组的实现.这种实现方式需要预先制定一 ...

  8. 栈的基本操作 python

    7-4 栈的基本操作 (10 分) 给定一个初始为空的栈和一系列进栈.出栈操作,请编写程序输出经过这些操作后栈的元素.栈的元素值均为整数. 输入格式: 输入第1行为1个正整数n,表示操作个数: 第2行 ...

  9. 链栈的基本操作-C语言

    链栈的基本操作 用链表实现一个栈 具体实现 定义一个链栈 //定义一个链栈 typedef struct LNode {int data;struct LNode* next; }LNode, *Li ...

  10. C语言实现顺序栈的基本操作(初始化、判断空、入栈、出栈、获取栈顶元素)

    //顺序栈的基本操作 #include<stdio.h> #define MaxSize 50 typedef int ElemType; //定义栈结构体 typedef struct ...

最新文章

  1. 分布式深度学习最佳入门(踩坑)指南
  2. AdminIII连接linux Postgresql过程中的几个小问题
  3. TZOJ上的C语言作业答案,C语言编程练习
  4. 2020-12-3(详解虚拟地址如何转化为物理地址)
  5. 6.Python标准库_子进程 (subprocess包)
  6. 第二章:变量和运算符
  7. mysql删除emp表的语句_MySQL删除数据表(DORP TABLE语句)
  8. java lucence_Lucence使用入门
  9. 【Java编译】含package的类文件编译
  10. 【Alpha】第七次Scrum meeting
  11. 《Oracle SQL疑难解析》——1.10 删除表中的所有行
  12. 数据分析 第三篇:数据特征分析(分布分析+帕累托分析)
  13. Android StorageManager 存储设备管理
  14. 横向合计代码 锐浪报表_报表开发常见问题解答 - 锐浪报表工具
  15. Redis配置文件redis.conf配置详解
  16. openlayers中海图的加载
  17. 学计算机投影仪定义,一种计算机信息技术教学用投影仪的制作方法
  18. 基于JNA(Java Native Access)实现RFID单卡、多卡读取以及写入。
  19. WPF 不要给 Window 类设置变换矩阵(分析篇):System.InvalidOperationException: 转换不可逆。
  20. 生产级搭建openresty+waf防火墙

热门文章

  1. Linux安装中文字体
  2. Process Simulate
  3. ktv服务器管理系统,KTV收银管理系统.doc
  4. java爬虫教程01
  5. Atheros QCA8337交换芯片驱动开发
  6. Fortran入门教程(七)——数组
  7. 嵌入式ARM(Allwinner H3)下使用rtl8188eus无线网卡
  8. EEGLAB如何进行ERPs数据处理你都会了吗?看这里保证你一劳永逸的get ERPs数据处理技能
  9. 如何防止数据库中的信息被“脱库”-笔记
  10. 因多次登录失败导致的账户锁定,ssh无法登录处理