数据结构之---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语言实现了相关算法.在这里小编就不在继续给大家介绍了,需要温习的可以去我的博客看看.在这篇博 ...
随机推荐
- Python 45 长度及颜色单位 、字体样式 、文本样式 、背景样式 、css基础选择器
一:长度及颜色单位 长度单位 px(像素) in(英寸) pt(点),一个标准的长度单位,1pt = 1/72in mm(毫米) cm ...
- Redis(五)-数据库
Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以将制定的书存储在哪个字典中,这与关系书库实例中可以i创建多个数据库类似,所以可以将其中的每个字典 ...
- RabbitMQ .NET消息队列使用入门(二)【多个队列间消息传输】
孤独将会是人生中遇见的最大困难. 实体类: DocumentType.cs public enum DocumentType { //日志 Journal = 1, //论文 Thesis = 2, ...
- Windows phone开发 页面布局之屏幕方向
(博客部分内容参考Windows phone开发文档) Windows phone的屏幕方向是利用Windows phone设备的方向传感器提供的数据实现切换的. Windows Phone支持纵向和 ...
- css选择器的综合使用
代码实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf ...
- js-内置对象及相关语法
1:如图(视频截取的) this指的是当前标签的对象. var ary=new Array("mark","jay","leslie"); ...
- 启动MyEclipse 出现java.lang.RuntimeException: No application id has been found 解决办法
咋一看,太熟悉了,就去eclipse\links 目录下,发现指定的MyEclipse的路径不对. 突然想起来了,MyEclipse是换地了. MyEclipse里面内置的eclipse找不到MyEc ...
- java Web(2)
Servlet与web容器的配合: 1)客户端向Web服务器发起一个HTTP请求. 2)HTTP请求被Web服务器接受,如果请求的是静态页面,则由Web服务器负责处理.如果请求的是Java Web组件 ...
- MFC 缩放和显示IplImage
序言:使用OpenCV嵌入MFC的框内,图像大小不能和框大小进行匹配,因此需要缩放,使图像适用于MFC框. 后来找到了一种新的方法,此方案貌似u已经废弃. (1).在MFC中显示图片 void CAv ...
- BZOJ 2959: 长跑 LCT_并查集_点双
真tm恶心...... Code: #include<bits/stdc++.h> #define maxn 1000000 using namespace std; void setIO ...