多栈共享技术,双端栈的初始化、进栈、出栈操作

栈的应用非常广泛,经常会出现一个程序中需要同时使用多个栈的情况。若使用顺序栈,会因为对栈空间大小难以准确估计,从而产生有的栈溢出、有的栈空间还很空闲的情况。为了解决这个问题,可以让多个栈共享一个足够大的数组空间,通过利用栈的动态特性来使其存储空间互相补充,这就是多栈的共享技术。

在顺序栈的共享技术中,最常用的是两个栈的共享技术,即双端栈。它主要利用了栈的栈底位置不变,而栈顶位置动态变化的特性。

实现代码如下:

#include<iostream>

using namespace std;

#define  TRUE 1

#define  FALSE 0

#define M 100

//双端顺序栈的存储结构

typedef struct

{

int Stack[M];//Stack[M]为栈区

int top[2];//top[0]和top[1]分别为两个栈顶指示器

}DqStack;

//初始化双端顺序栈

void InitStack(DqStack *S)

{

S->top[0] = -1;

S->top[1] = M;

}

//双端顺序栈进栈操作

int Push(DqStack *S,int x,int i)//把数据元素x压入i号堆栈

{

if (S->top[0]+1 == S->top[1])//栈已满

{

return FALSE;

}

switch (i)

{

case 0:   //0号栈

S->top[0]++;

S->Stack[S->top[0]] = x;

break;

case 1:   //1号栈

S->top[1]--;

S->Stack[S->top[1]] = x;

break;

default:    //参数错误

return FALSE;

break;

}

return TRUE;

}

//双端顺序栈出栈操作

int Pop(DqStack *S, int *x, int i)//从i号堆栈中弹出栈顶元素并送到x中

{

switch (i)

{

case 0:   //0号栈出栈

if (S->top[0] ==-1)

{

return FALSE;

}

*x=S->Stack[S->top[0]] ;

S->top[0]--;

break;

case 1:   //1号栈出栈

if (S->top[1] == M)

{

return FALSE;

}

*x = S->Stack[S->top[1]];

S->top[1]++;

break;

default:

return FALSE;

break;

}

return TRUE;

}

时间: 2024-10-10 17:27:46

多栈共享技术,双端栈的初始化、进栈、出栈操作的相关文章

数据结构之栈(2)——多栈共享技术

多栈共享技术的应用:经常会发生一个程序使用多个栈的情况,然而若使用顺序栈,因为难以对每个栈的空间准确估计,所以会发生有的栈已经溢出,有的栈却还很空闲的状况,解决方案是:可以让多个栈共享一个足够大的数组空间,通过利用栈的动态特性来使其存储空间相互补充,这就是多栈的共享技术 双端栈: 首先申请一个共享的一位数组空间S[M],将两个栈的栈底分别放在数组的两端,即:0,M-1栈顶动态变化,从而多栈共享,提高空间利用率 双端栈的定义 typedef char ElemType; typedef struc

进栈出栈的合法性检查

栈与进栈出栈 栈:是限定在栈表尾进行插入或删除的线性表,又称为后进先出(LIFO)的线性表,这个特点可以形象的表示为--(铁路调度站) 只要保证每次在栈顶操作,同一进栈顺序可以有不同的出栈顺序,以下是部分出栈顺序 34521   25431  14532 32145    43215 那么究竟怎样验证一个出栈序列与一个入栈序列匹配? 思路:将进栈和出栈序列分别存在数组里,然后再创建一个辅助栈,把输入序列中的元素依次压入栈中,并按照出栈序列依次弹出. 将进栈和出栈序列存在两个数组里,然后再创建一个

数据结构之进栈出栈操作

先建立一个结构体节点: typedef struct Node{ int member; struct Node *pNext; }Node,*pNode: 创建一个栈: typedef struct stack{ pNode Top; pNode Bot; }Stack,*pStack; //初始话栈内部 void Init_stack(pStack ps) { ps->Top= (pNode)malloc(sizeof(Node)): if (NULL == ps->Top) exit(-

安卓 碎片 如何实现类似 活动 栈的 进栈 出栈

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha 碎片 的 事物管理器 内部维持了 一个双向链表结构, 可以记录每次添加的碎片和 替代的 碎片. 然后 后退的时候, 会自动 出栈. 碎片,可以容易实现 局部更新. 原来 是把多个布局 放到 活动里. 现在可以用 碎片替代. 只在需要的时候加载 碎片. 提高了性能. 碎片 可以适应不同的屏幕尺寸. 切换碎片 ,通过 添加, 隐藏,添加另一个碎片.再次切换时,隐藏当前碎片,显示另一个.

数据结构-顺序栈(进栈 出栈)

#include<stdio.h> #define MaxSize 10 typedef struct SqStack{ int data[MaxSize]; int top ; }SqStack; //初始化顺序栈 void initStack(SqStack &S){ S.top = -1; } //判断栈是否为空 /*栈理论上不存在为满的情况,取决于内存大小*/ int isEmpty(SqStack S){ if(S.top == -1){//top为1表示为空 return

(源代码见大话数据结构)栈的顺序存储结构——进栈&amp;出栈

#include <stdio.h>#include <time.h>#include <stdlib.h>#define MAXSIZE 1000#define OK 1#define ERROR 0#define TRUE 1#define FALS 0typedef int SElemType;typedef int Status;typedef struct{    SElemType data[MAXSIZE];    int top;}SqStack;Sta

进栈 出栈

#include "stdafx.h"#include "iostream" using namespace std; class Stack{public: virtual void push(char c) = 0; virtual char pop() = 0;}; class ArrayStack:public Stack{public: ArrayStack(int s); ~ArrayStack(); void push(char c); char po

队列的应用:双端队列

双端队列(Deque:double ended queue)就是一个两端都是结尾的队列.队列的每一端都可以插入数据项和移除数据项.相对于普通队列,双端队列的入队和出队操作在两端都可进行. 双端队列的示意图: left:左端    right:右端 这里我们使用最常用的顺序结构来存储双端队列,为了节省空间,把它首尾相连,构成循环队列.并且规定left指向左端的第一个元素,right指向右端的下一个位置.那么队空的判断则是left==right,队满是(left-1+MAX)%MAX==right或

双端队列的应用

双端队列是一种特殊队列,它是在线性表的两端对插入和删除操作限制的线性表.双端队列可以在队列的任何一端进行插入删除操作. #include <stdio.h> #define QUEUESIZE 8 typedef char ElemType; typedef struct DQueue { ElemType queue[QUEUESIZE]; int end1; int end2; }DQueue; int EnQueue(DQueue *DQ,ElemType e,int tag); int