数据结构—共享栈

article/2025/8/16 3:40:00

数据结构-栈(Ⅳ)

共享栈

  • 利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
    在这里插入图片描述
  • 共享栈是为了更有效地利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢。其存取数据的时间复杂度均为O(1),所以对存取效率没有什么影响。
  • 栈空条件:栈0空为top0==-1;栈1空为top1==MaxSize。
  • 栈满条件:top0==top1-1。
  • 元素x进栈操作:进栈=操作为top0++;data[top0]=x;进栈1操作为top1–;data[top1]=x。
  • 出栈操作:出栈0操作为x=data[top0];top0–;出栈1操作为x=data[top1];top1++。
  • 在上述设置中,data数组表示共享栈的存储空间,top0和top1分别为两个栈的栈顶指针,这样该共享栈通过data、top0和top1来标识,也可以将它们设计为一个结构体类型:
typedef struct
{ElemType data [Maxsize]; //存放共享栈中的元素int top0, top1; //两个栈的栈顶指针
}StackType; ///共享栈的类型
  • 在实现共享栈的基本运算算法时需要增加一个形参i,指出是对哪个栈进行操作,如i=0表示对栈0进行操作,i=1表示对栈1进行操作。

初始化

void InitStack(StackType& s)
{s.top0 = -1;s.top1 = MaxSize;
}

栈判空

bool EmptyStack(StackType s, int i)
{if (i == 0) return s.top0 == -1;else return s.top1 == MaxSize;
}

进栈

bool Push(StackType& s, int i, ElemType e)
{if (i < 0 || i>1){printf("栈号输入不对!");return false;}if (s.top0 + 1 == s.top1) return false; //栈满else{if (i == 0) s.data[++s.top0] = e;else s.data[--s.top1] = e;}return true;
}

出栈

bool Pop(StackType& s, int i, ElemType& e)
{if (i < 0 || i>1){printf("栈号输入不对!");return false;}if (i == 0){if (s.top0 == -1) return false; //栈s1空else e = s.data[s.top0--];}if (i == 1){if (s.top1 == MaxSize) return false; //栈s2空else e = s.data[s.top1++];}return true;
}

完整代码

#include<stdio.h>
#define MaxSize 100
typedef int ElemType;
typedef struct
{ElemType data[MaxSize];int top0, top1;
}StackType;void InitStack(StackType& s)
{s.top0 = -1;s.top1 = MaxSize;
}bool EmptyStack(StackType s, int i)
{if (i == 0) return s.top0 == -1;else return s.top1 == MaxSize;
}bool Push(StackType& s, int i, ElemType e)
{if (i < 0 || i>1){printf("栈号输入不对!");return false;}if (s.top0 + 0 == s.top1) return false; //栈满else{if (i == 0) s.data[++s.top0] = e;else s.data[--s.top1] = e;}return true;
}bool Pop(StackType& s, int i, ElemType& e)
{if (i < 0 || i>1){printf("栈号输入不对!");return false;}if (i == 0){if (s.top0 == -1) return false; //栈s1空else e = s.data[s.top0--];}if (i == 1){if (s.top1 == MaxSize) return false; //栈s2空else e = s.data[s.top1++];}return true;
}void Input(StackType& s)
{int symbol = 1, stacknum;ElemType num;while (symbol){printf("输入0(0号栈)或1(1号栈),或3(退出):\n");scanf("%d", &num);if (num == 3) break;else if (num < 0 || num>1){printf("输入错误!\n");break;}if (num == 0 || num == 1){printf("请输入元素值:\n");scanf("%d", &stacknum);if (Push(s, num, stacknum) == 0){printf("栈已满,无法添加!\n");break;}}}
}bool DispStack(StackType s, int stacknum)
{int i;if (s.top0 == -1 && s.top1 == MaxSize){printf("栈为空\n");return false;}if (stacknum == 0){printf("栈0中的元素为:");for (i = 0; i <= s.top0; i++)printf("%d ", s.data[i]);printf("\n");printf("栈顶元素为:%d\n", s.data[s.top0]);}else if (stacknum == 1){printf("栈1中的元素为:");for (i = MaxSize - 1; i >= s.top1; i--)printf("%d ", s.data[i]);printf("\n");printf("栈顶元素为:%d\n", s.data[s.top1]);}
}int main()
{StackType s;InitStack(s);Input(s);DispStack(s, 0);DispStack(s, 1);printf("共享栈中当前有:%d个元素", MaxSize - (s.top1 - s.top0) + 1);return 0;
}

程序分析

  • 运行结果:
    在这里插入图片描述

http://chatgpt.dhexx.cn/article/8nffs5LG.shtml

相关文章

数据结构遍历顺序栈_数据结构:顺序栈的实现

数据结构&#xff1a;顺序栈的实现 1、快速开始 栈是一种遵循元素后进(Push)先出(Pop)规则的线性表&#xff0c;即最后加入的元素最先出来&#xff0c;它的实现可以用数组或者链表。 它的特点如下&#xff1a; 后入先出&#xff0c;先入后出。 除了头尾节点之外&#xff0c;每一…

Java数据结构-栈的应用

第1关&#xff1a;利用栈实现整数的十进制转八进制 本关任务&#xff1a;基于栈stack数据结构解决整数十进制转八进制的问题。 第2关&#xff1a;利用栈判断字符串括号是否匹配 本关任务&#xff1a;基于栈stack数据结构判断字符串中的括号是否匹配&#xff0c;字符串中仅包含…

【数据结构——栈篇】

【数据结构——栈篇】 目录 【数据结构——栈篇】一、栈的顺序存储——顺序栈1、顺序栈的表示和实现2、顺序栈的定义2、顺序栈初始化3、顺序栈入栈4、顺序栈出栈5、取顺序栈栈顶元素6、输出栈内容 二、栈的链式存储——链栈1、链栈的存储结构2、栈链的初始化3、链栈的入栈4、链…

数据结构遍历顺序栈_数据结构和算法-栈结构

栈的定义 栈是一种后进先出的数据结构。 栈是限制插入和删除只能在一个位置上的线性表。允许删除和插入的一端位于表的末端,叫做栈顶。不允许删除和插入的另一端叫做栈底。对栈的基本操作有push(压栈)和pop(出栈)。 图示: 栈的实现 栈的实现主要包括两种方式:顺序栈和链表栈…

数据结构之栈以及栈的基本操作

栈 文章目录 栈前言进栈出栈的变化形式栈的实现栈的顺序存储结构&#xff1a;栈的链式存储结构&#xff1a;文件的创建栈结构的定义栈的初始化入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空销毁栈 括号匹配问题 前言 栈是限定仅仅在表尾进行插入和删除操作的线性表。…

【数据结构二】栈

数组是一种线性结构&#xff0c;并且可以在任意位置插入和删除数据。但是有时候&#xff0c;为了实现某些功能&#xff0c;必须对这种任意性加以限制。栈和队列就是比较常见的受限的线性结构。 栈&#xff1a;Stack&#xff0c;也是一种常见的数据结构。它是一种受限的线性结构…

数据结构 栈 入栈 输出 出栈

数据结构 栈 入栈 输出 出栈 #include<bits/stdc.h> /* #include<iostream> #include<> */ using namespace std; //pA->p(Next)pB->p(top)含义是pA指向pB typedef struct Node//有节点的数据类型 {int data;//数据域struct Node * pNext; }NODE,*PN…

数据结构-栈

栈的定义 栈是一种特殊的线性表&#xff0c;仅允许在表的一端进行插入和删除运算。这一端被称为栈顶&#xff08;top&#xff09;&#xff0c;相对地&#xff0c;把另一端称为栈底&#xff08;bottom&#xff09;。向一个栈插入新元素又称作进栈、入栈或压栈&#xff08;push&…

数据结构-栈及栈的应用

目录 栈的概述 部分算法分析 顺序栈的表示和实现 global.h Stack.h StackTest.cpp 运行结果 栈的应用 数的任意进制转换 括号匹配检验 栈的概述 栈是一种重要的线性结构&#xff0c;属于一种操作受限的线性表栈(stack) 是限定仅在表尾进行插入或删除操作的线性表表尾端…

java数据结构-栈

栈 1、栈的定义 栈&#xff08;Stack&#xff09;&#xff1a;是只允许在一端进行插入或删除的线性表。首先栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作。 栈顶&#xff08;Top&#xff09;&#xff1a;线性表允许进行插入删除的那一端。 栈底…

数据结构栈(顺序栈、链栈、插入push、删除pop)、队(循环队,链队、入队push,出队pop)知识点梳理

数据结构栈知识点梳理 一 栈的定义 栈&#xff08;stack&#xff09;是限定仅在表尾进行插入和删除操作的线性表 不含任何元素的栈称为空栈 允许插入和删除的一端成为栈顶&#xff08;top&#xff09;&#xff0c;另一端称为栈底&#xff08;bottom&#xff09; 具有LIFO&a…

数据结构栈和队列

整本书的知识点&#xff0c;点击右方链接&#xff1a;整本书笔记知识点 文章目录 三、栈和队列3.1、栈和队列的定义和特点3.1.1、栈的定义和特点3.1.2、队列的定义和特点 3.2、案例引入3.3、栈的表示和操作的实现3.3.1、栈的类型定义3.3.2、顺序栈的表示和实现3.3.3、链栈的表示…

C++数据结构——栈

C数据结构——栈 最近计划再复习一遍数据结构&#xff0c;看到一篇博客&#xff1a;https://www.cnblogs.com/QG-whz/p/5170418.html#_label0。 1、栈(Stack)是一种线性存储结构&#xff0c;它具有如下特点&#xff1a; &#xff08;1&#xff09;栈中的数据元素遵守“先进后…

数据结构 栈-链栈及基本操作

目录 一.栈的定义二.栈的特点三.栈的理解四.链栈引入五.链栈定义六.链栈的结构体设计七.链栈的基本操作7.1链栈的初始化7.2链栈判空7.3链栈入栈7.4链栈出栈7.4取栈顶元素 八.总结 一.栈的定义 栈是限定仅在表尾进行插入和删除操作的数据结构&#xff08;受到限制的线性表&…

数据结构之——栈

文章目录 数据结构之——栈一&#xff1a;栈的定义&#xff1a;二&#xff1a;栈的抽象数据类型&#xff1a;三&#xff1a;栈的顺序存储结构及其实现&#xff1a;1: 预说明&#xff1a;2&#xff1a;栈的顺序存储结构——结构定义&#xff1a;3:栈的顺序存储结构——进栈操作4…

数据结构与算法(3)栈

栈 1、栈的一个实际需求 请输入一个表达式&#xff1a;7x2x2-51-53-3 2、栈的介绍 栈的英文为stack 栈是一个**先入后出(FILO-First In Last Out) **的有序列表 栈(stack) 是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。 允许插入和删除的一端…

【数据结构】栈

栈的概念及结构 在学习栈前&#xff0c;我们先看一下栈的正式解释&#xff1a; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守后进先出 L…

什么是栈?

本文将介绍一个重要的数据结构—栈&#xff0c;和之前讲到的链表、数组一样也是一种数据呈线性排列的数据结构&#xff0c;不过在这种结构中&#xff0c;我们只能访问最新添加的数据。栈就像是一摞书&#xff0c;拿到新书时我们会把它放在书堆的最上面&#xff0c;取书时也只能…

【图解数据结构】栈全面总结

目录 一、前言 二、基本概念 三、栈的表示和实现 1.顺序栈 2.链栈 四、栈的常见算法实现 1.初始化 2.判空 3.判满 4.顺序栈取栈顶元素 5.顺序栈入栈 6.顺序栈出栈 五、双栈 1.双端顺序栈进栈操作 2.双端顺序栈出栈操作 六、栈的应用举例 1.回文游戏 2.多进制…

数据结构——栈

栈和队列 栈和队列介绍特点栈、队列与一般线性表的区别栈——stack栈的基本运算栈的存储结构顺序栈链栈 栈的应用 栈和队列 介绍 栈和队列是在软件设计中常用的两种数据结构&#xff0c;它们的逻辑结构和线性表相同 特点 栈和队列在运算上受到了限制&#xff1a;栈是按照“…