_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->top[0]=0;
	S->top[1]=StackSize-1;
}
//共享栈进栈操作。进栈成功返回1,否则返回0
int PushStack(SSeqStack *S,DataType e,int flag){
	if(S->top[0]==S->top[1])	//在进栈操作之前,判断共享栈是否为空
		return 0;
	switch(flag){
	case 0:		//当flag为0,表示元素要进左端的栈
		S->stack[S->top[0]]=e;	//元素进栈
		S->top[0]++;	//修改栈顶指针
		break;
	case 1:		//当flag为1,表示元素要进右端的栈
		S->stack[S->top[1]]=e;	//元素进栈
		S->top[1]--;	//修改栈顶指针
		break;
	default:
		return 0;
	}
	return 1;
}
//出栈操作
int PopStack(SSeqStack *S,DataType *e,int flag){
	switch(flag){		//在出栈操作之前,判断是哪个栈要进行出栈操作
	case 0:
		if(S->top[0]==0)	//左端的栈为空,则返回0,表示出栈操作失败
			return 0;
		S->top[0]--;	//修改栈顶指针
		*e=S->stack[S->top[0]];	//将出栈的元素赋值给e
		break;
	case 1:
		if(S->top[1]==StackSize-1)		////右端的栈为空,则返回0,表示出栈操作失败
			return 0;
		S->top[1]++;		//修改栈顶指针
		*e=S->stack[S->top[1]];		//将出栈的元素赋值给e
		break;
	default:
		return 0;
	}
	return 1;
}
//取栈顶元素。将栈顶元素值返回给e,并返回1表示成功;否则返回0表示失败。
int GetTop(SSeqStack S,DataType *e,int flag){
	switch(flag){
	case 0:
		if(S.top[0]==0)
			return 0;
		*e=S.stack[S.top[0]-1];
		break;
	case 1:
		if(S.top[1]==StackSize-1)
			return 0;
		*e=S.stack[S.top[1]+1];
		break;
	default:
		return 0;
	}
	return 1;
}
int StackEmpty(SSeqStack S,int flag){
	switch(flag){
	case 0:
		if(S.top[0]==0)
			return 1;
		break;
	case 1:
		if(S.top[1]==StackSize-1)
			return 1;
		break;
	default:
		return 0;
	}
	return 0;
}
void main(){
	SSeqStack S1,S2;			/*定义一个栈*/
	int i;
	DataType a[]={'a','b','c','d','e'};
	DataType b[]={'x','y','z','r'};
	DataType e1,e2;
	InitStack(&S1);					/*初始化栈*/
	InitStack(&S2);
	for(i=0;i<sizeof(a)/sizeof(a[0]);i++)	/*将数组a中元素依次进栈*/
	{
		if(PushStack(&S1,a[i],0)==0)
		{
			printf("栈已满,不能进栈!");
			return;
		}
	}
	for(i=0;i<sizeof(b)/sizeof(b[0]);i++)	/*将数组b中元素依次进栈*/
	{
		if(PushStack(&S2,b[i],1)==0)
		{
			printf("栈已满,不能进栈!");
			return;
		}
	}
	if(GetTop(S1,&e1,0)==0)
	{
		printf("栈已空");
		return;
	}
	if(GetTop(S2,&e2,1)==0)
	{
		printf("栈已空");
		return;
	}
	printf("栈S1的栈顶元素是:%c,栈S2的栈顶元素是:%c\n",e1,e2);
	printf("S1出栈的元素次序是:");
	i=0;
	while(!StackEmpty(S1,0))
	{
		PopStack(&S1,&e1,0);
		printf("%4c",e1);
	}
	printf("\n");
	printf("S2出栈的元素次序是:");
	while(!StackEmpty(S2,1))
	{
		PopStack(&S2,&e2,1);
		printf("%4c",e2);
	}
	printf("\n");
	system("pause");
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 06:33:19

_DataStructure_C_Impl:共享栈的相关文章

_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; }SeqStack; //将栈初始化为空栈只需要把栈顶指针top置为 void InitStack(SeqStack *S){ S->top=0;//把栈

_DataStructure_C_Impl:链栈

//_DataStructure_C_Impl:链栈 #include<stdio.h> #include<stdlib.h> typedef char DataType; typedef struct node{ DataType data; struct node *next; }LStackNode,*LinkStack; //将链栈初始化为空.动态生成头结点,并将头结点的指针域置为空 void InitStack(LinkStack *top){ if((*top=(Lin

数据结构之---C语言实现共享栈

所谓共享栈是两个栈在一个顺序的存储空间中.两个栈的栈底分别是存储空间的首尾地址. 如图我们可以将两个栈构造成一个: 如图: 从这里也就可以分析出来,栈1为空时,就是top1等于-1时:而当top2等于n时,即是栈2为空时,那么什么时候栈满呢? 想想极端的情况,若栈2是空栈,栈1的top1等于n-1时,就是栈1满了.反之,当栈1为空栈时,top2等于0时,为栈2满.但更多的情况,其实就是刚才说的,两个栈见面之时,也就是两个指针之间相差1时,即top1+1==top2为栈满. 具体的实现代码如下:

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

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

使用一维数组实现共享栈操作

所谓的共享栈就是两个虚拟的栈使用一块固定大小的数组元素,涉及到如何不冲突的进行入栈出栈操作.对一维数组即在数组两头设置两个栈顶标记(指针).然后分别这两个进行入栈出栈操作.当前面的栈标记位置+1=后面栈的位置,那么不可以进行入栈操作,如果两个栈有在栈底(对前面的来说是top1==-1,后一个是top2==n)是不可以进行出栈操作的. 结构图如下: //函数根据operate这个字符串内容是push还是pop,flag是1还是2表示是前面一部分栈还是后一部分栈,n表示共享栈stack_array[

动手写操作系统 -- 任务切换(共享栈)

同步来自我的博客:http://fillzero.github.io/os/diy-os-04.html

共享栈

#include <stdio.h> #include <string.h> #include <stdlib.h> typedef int dataType; #define MAXSIZE 8 typedef struct shareStack {     dataType data[MAXSIZE];     int leftTop;     int rightTop; }shareStack; void initshareStack(shareStack *s)

算法之 栈内存共享空间

package bin; import java.util.ArrayList; import java.util.List; import javax.management.RuntimeErrorException; /** * @author bin 15/3/10 * target 共享栈空间 * */ public class Bin_stack_share { private int top1;//栈一的栈顶记录 private int top2;//栈二的栈顶记录 private

数据结构-栈

定义 栈(Stack):只允许在一端进行插入或删除操作的线性表.首先栈是一种特殊的线性表,但是限定这种线性表只能在某一端进行插入和删除操作,如图3-1所示. 栈顶(top):线性表允许进行插入和删除的那一端. 栈底(bottom):固定的,不允许进行插入和删除的另一端. 空栈:不含任何元素的空表. 逻辑结构 添加元素只能在尾节点后添加,删除元素只能删除尾节点,查看节点也只能查看尾节点. 形象的说,栈是一个先进后出(LIFO)表,先进去的节点要等到后边进去的节点出来才能出来. 存储结构 栈的存储方