数据结构之---C语言实现共享栈
所谓共享栈是两个栈在一个顺序的存储空间中。两个栈的栈底各自是存储空间的首尾地址。
如图我们能够将两个栈构造成一个:
如图:
从这里也就能够分析出来,栈1为空时,就是top1等于-1时。而当top2等于n时,即是栈2为空时,那么什么时候栈满呢?
想想极端的情况,若栈2是空栈,栈1的top1等于n-1时,就是栈1满了。反之,当栈1为空栈时。top2等于0时,为栈2满。
但很多其它的情况,事实上就是刚才说的,两个栈见面之时,也就是两个指针之间相差1时。即top1+1==top2为栈满。
详细的实现代码例如以下:
//共享栈
//杨鑫
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 60
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType data[MaxSize];
int top1;
int top2;
}Stack, *pStack; Status init_Stack(pStack S)
{
S->top1 = -1;
S->top2 = MaxSize;
return OK;
} Status push_Stack(pStack S, ElemType e, int stackNumber)
{
if (S->top1+1 == S->top2)
return ERROR;
switch(stackNumber)
{
case 1:
S->data[++S->top1] = e;
break;
case 2:
S->data[--S->top2] = e;
break;
}
return OK;
} Status pop_Stack(pStack S, ElemType *e, int stackNumber)
{
if (1 == stackNumber)
{
if (-1 == S->top1)
return ERROR;
*e = S->data[S->top1--];
}
else if (2 == stackNumber)
{
if (MaxSize == S->top2)
return ERROR;
*e = S->data[S->top2++];
}
return OK;
} Status dis_pStack(pStack S, int stackNumber)
{
int i;
if (1 == stackNumber)
{
if (-1 == S->top1)
return ERROR; printf("栈1中的元素为:\n");
for (i=0; i<=S->top1; ++i)
printf("%d ", S->data[i]);
printf("\n==================================\n");
}
else if (2 == stackNumber)
{
if (MaxSize == S->top2)
return ERROR;
printf("栈2中的元素为:\n");
for (i=MaxSize-1; i>=S->top2; --i)
printf("%d ", S->data[i]);
printf("\n==================================\n");
}
} int main()
{
printf("======共享栈===========\n\n");
Stack S;
ElemType e;
init_Stack(&S);
push_Stack(&S, 1, 1);
push_Stack(&S, 2, 1);
push_Stack(&S, 3, 1);
push_Stack(&S, 4, 1);
push_Stack(&S, 5, 1);
push_Stack(&S, 6, 1);
pop_Stack(&S, &e, 1);
push_Stack(&S, 10, 2);
push_Stack(&S, 9, 2);
push_Stack(&S, 8, 2);
push_Stack(&S, 7, 2);
dis_pStack(&S, 1);
dis_pStack(&S, 2);
return 0;
}
图片:
数据结构之---C语言实现共享栈的更多相关文章
- 数据结构(C语言版)---栈
1.栈:仅在表尾进行插入和删除操作的线性表.后进先出LIFO. 1)表尾端(允许插入和删除的一端)为栈顶,表头端(不允许插入和删除的一端)为栈底. 2)入栈:插入元素的操作.出栈:删除栈顶元素 3)栈 ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- 数据结构算法C语言实现(七)--- 3.1栈的线性实现及应用举例
一.简述 栈,LIFO.是操作受限的线性表,和线性表一样有两种存储表示方法.下面以顺序存储为例,实现. 二.ADT 暂无. 三.头文件 //3_1.h /** author:zhaoyu email: ...
- 数据结构算法C语言实现(十)--- 3.3栈与递归的实现
一.简介 汉诺塔问题是递归的一个典型例子,而且书上的讲解很详细,对理解C语言函数及函数传参的工作机制很有帮助,值得一看.而且,递归在我看来和分治.DP.贪心等一样是十分优美的思想,值得学习!!! 二. ...
- 数据结构算法C语言实现(二十七)--- 7.2图的遍历
一.简述 栈与队列,DFS与BFS.仅以连接表为例实现. 二.头文件 BFS要用到的头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@g ...
- 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树
一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...
- 数据结构(c语言描述)
预备的数学知识 数据结构的概念 基本名词 算法 线性表 线性表的定义和基本操作 顺序表 顺序表增 顺序表删 顺序表查 单链表 建立单链表 单链表增 单链表删 单链表查 双链表 循环链表 静态链表 栈 ...
- C语言实现链栈以及基本操作
链栈,即用链表实现栈存储结构.链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底,如下下图所示: 将链表头部作为 ...
- C++语言实现顺序栈
C++语言实现顺序栈 在写C语言实现顺序栈的时候,我已经向大家介绍了栈的特点以及介绍了栈的相关操作,并利用C语言实现了相关算法.在这里小编就不在继续给大家介绍了,需要温习的可以去我的博客看看.在这篇博 ...
随机推荐
- 在redhat6上装1.8以下的docker
因为目前1.8以上的docker最低要求是3.10的Linux内核,而我的内核版本远低于此. [root@localhost home]# uname -r -.el6.x86_64 鉴于我的vm上有 ...
- IDEA 使用 git (码市)
1.下载 git,并安装(一直下一步) 2.使用IDEA,检出项目,检出方式选择:git, 3.如果项目有修改,上传修改的文件 4.下载 SourceTree(git的图形化工具),并安装(一直下一步 ...
- canvas 和 svg
对于开发人员而言,最直观的区别在于:1.对于画在Canvas上的部件,你需要处理重绘.而SVG则不用,你修改svg dom则系统会自动帮你重绘2.Hittest,即canvas不负责帮你侦测鼠标/触摸 ...
- windows server 2012 r2 安装无法找到install.wim 错误代码0x80070026,以及制作U启动盘决解ISO文件超过5G大小限制的解决方案(转)
戴尔服务器r530 windows server 2012 r2 安装无法找到install.wim 错误代码0x80070026,以及制作U启动盘决解ISO文件超过5G大小限制的解决方案 关于在服务 ...
- Currying vs Partial Application
柯里化相当于函数重构: 偏函数相当于函数适配. So, what is the difference between currying and partial application? As we s ...
- [Jxoi2012]奇怪的道路 题解(From luoguBlog)
题面 状压好题 1<= n <= 30, 0 <= m <= 30, 1 <= K <= 8 这美妙的范围非状压莫属 理所当然地,0和1代表度的奇偶 dp[i][j ...
- JDK8新特性 -- Function接口: apply,andThen,compose
1 Function<T, R>中的T, R表示接口输入.输出的数据类型. R apply(T t) apply: .例子:func是定义好的Function接口类型的变量,他的输入.输出 ...
- 使用JAVA写一个简单的日历
JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...
- 【转载】深入理解Java的接口和抽象类
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- eas之kdtable分组
如何指定是否要进行数据分组以及对哪些列进行分组 // 指定KDTable要进行数据分组 table.getGroupManager().setGroup(true); // 指明要对0.1.2三列进行 ...