【数据结构】将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空;当第1号栈的栈顶指针top[1]等于m时,该栈为空。两个栈均

这篇博客介绍了如何在一个数组中实现编号为0和1的两个栈,栈底位于数组两端,栈从两端向中间增长。内容涵盖了双栈的初始化、栈空判断、栈满判断、进栈和出栈的算法。提供了相关代码,并鼓励读者在作者的个人网站上进行交流和讨论。
摘要由CSDN通过智能技术生成

将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空;当第1号栈的栈顶指针top[1]等于m时,该栈为空。两个栈均从两端向中间增长(见下图)。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。双栈数据结构的定义如下:

typedef struct{
   
int top [ 2],bot [ 2]//栈顶和栈底指针
SElemType *v ;//栈数组
int m ;//栈最大可容纳元素个数
}Dblstack;

图示
在这里插入图片描述

代码

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OK 1
#define INIT_SIZE 5
#define INCREASE_SIZE 2
#define OVERFLOW -1
#define EMPTY_ELEM -1

typedef int ElemType;
typedef int status;

typedef struct {
   
    int top[2], bot[2];//栈顶和栈底指针
    ElemType *v;//栈数组
    int m;//栈最大可容纳元素个数
} DblStack;

//数组初始化要使用malloc, 否则只是进行了声明, 未开辟空间无法存储内容
void initDblStack(DblStack &stack) {
   
    ElemType *arr = (ElemType *) malloc(sizeof(ElemType) * INIT_SIZE);
    stack.v = arr;
    stack.m = INIT_SIZE;
    stack.top[0] = 0;
    stack.bot[0] = 0;
    stack.top[1] = stack.m - 1;
    stack.bot[1] 
以下是双初始化、判断满、进和出算法的函数: ``` #include <stdio.h> #include <stdlib.h> #define ERROR -1 #define OK 1 typedef int SElemType; typedef struct { int top[2], bot[2]; // 顶和栈底指针 SElemType *V; // 数组 int m; // 最大可容纳元素个数 } DblStack; // 双初始化 int InitDblStack(DblStack *S, int m) { S->V = (SElemType *)malloc(m * sizeof(SElemType)); if (!S->V) { return ERROR; } S->top[0] = -1; S->bot[0] = 0; S->top[1] = m; S->bot[1] = m - 1; S->m = m; return OK; } // 判断 int IsDblStackEmpty(DblStack S, int i) { if (i == 0) { return S.top[0] == -1; } else if (i == 1) { return S.top[1] == S.m; } else { return ERROR; } } // 判断满 int IsDblStackFull(DblStack S) { return S.top[0] + 1 == S.top[1]; } // 进 int PushDblStack(DblStack *S, int i, SElemType e) { if (IsDblStackFull(*S)) { return ERROR; } if (i == 0) { S->top[0]++; S->V[S->top[0]] = e; } else if (i == 1) { S->top[1]--; S->V[S->top[1]] = e; } else { return ERROR; } return OK; } // 出 int PopDblStack(DblStack *S, int i, SElemType *e) { if (IsDblStackEmpty(*S, i)) { return ERROR; } if (i == 0) { *e = S->V[S->top[0]]; S->top[0]--; } else if (i == 1) { *e = S->V[S->top[1]]; S->top[1]++; } else { return ERROR; } return OK; } int main() { DblStack S; int m = 10; InitDblStack(&S, m); PushDblStack(&S, 0, 1); PushDblStack(&S, 1, 2); SElemType e; PopDblStack(&S, 0, &e); printf("%d\n", e); PopDblStack(&S, 1, &e); printf("%d\n", e); return 0; } ``` 其,InitDblStack函数用于初始化双,IsDblStackEmpty函数用于判断,IsDblStackFull函数用于判断满,PushDblStack函数用于进,PopDblStack函数用于出。在主函数,我们先初始化双,然后分别向两个压入元素,再从两个分别弹出元素并输出。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值