数据结构之---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;
}

图片:

时间: 2024-11-06 14:53:00

数据结构之---C语言实现共享栈的相关文章

【 数据结构(C语言)】栈——顺序实现

栈:栈是一种特殊的线性表.其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行. /** ** 2017.11.3 ** Ahthor:799 ** 栈的顺序实现 ** ***/ #include <bits/stdc++.h> using namespace std; #define STACK_INIT_SIZE 100 /// 存储空间初始分配 #define STACK_INCREMENT 10 /// 存储空间分配增量 #define ElemType int #defin

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

数据结构算法C语言实现(十)--- 3.3栈与递归的实现

一.简介 汉诺塔问题是递归的一个典型例子,而且书上的讲解很详细,对理解C语言函数及函数传参的工作机制很有帮助,值得一看.而且,递归在我看来和分治.DP.贪心等一样是十分优美的思想,值得学习!!! 二.CPP文件 1 //3_3.cpp 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-8 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 54 9

数据结构_线性表_顺序存储之1顺序栈2共享栈_链式存储之链栈_栈的应用举例

1>//栈是先进后出,后进先出的线性表 简称LIFO线性表 //栈的顺序存储结构成为顺序栈(sequebtial stack). //顺序栈利用一组地址连的存储单元依次存放从栈底到 栈顶的数据元素,通常用一维数组存放栈的元素 //"指针"top并非指针,而是表示栈顶元素的当前位置 //top不是指针型变量而是整形变量,top=0空栈,top=MaxSize 表示满栈,当top>maxsize 表示栈溢出 代码 #include <stdio.h> #includ

数据结构(c语言描述)

数据结构(c语言描述) 目录 预备的数学知识 什么是数据结构 线性表 栈和队列 数组 串 树和二叉树 查找 排序 预备的数学知识 等差数列求和 Sn=(a1+an)*n/2 等比数列求和 Sn=a1*(1-q?)/(1-q) 什么是数据结构 基本概念 数据: 能够被计算机识别和处理的符号的集合 数据元素:是数据的基本单位,由若干的数据项构成,如一个人有手有脚 数据对象:由同类型的数据元素组成的集合,如一群人 数据类型:由一个集合和定义在此集合上的操作组成 原子类型:值不可再分的数据类型,如int

数据结构Java实现05----栈:顺序栈和链式堆栈

数据结构Java实现05----栈:顺序栈和链式堆栈 一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作. 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈. 备注:栈本身就是一个线性表,所以我们之前讨论过线性表的顺序存储和链式存储,对于栈来说,同样适

数据结构算法C语言实现(七)--- 3.1 的线性实现及应用举例

一.简述 栈,LIFO.是操作受限的线性表,和线性表一样有两种存储表示方法.下面以顺序存储为例,实现. 二.ADT 暂无. 三.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 46 9 10 #ifndef _3_1_H_ 11 #define _3_1_H_ 12

数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈及相关操作是第三章实现的,但数据类型做了更改. 二.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>&g

_DataStructure_C_Impl:共享栈

// _DataStructure_C_Impl:共享栈 #include<stdio.h> #include<stdlib.h> #define StackSize 100 typedef char DataType; //两个共享栈的数据结构类型定义 typedef struct { DataType stack[StackSize]; int top[2]; }SSeqStack; //共享栈的初始化操作 void InitStack(SSeqStack *S){ S->