五、数据结构之栈的共享栈存储结构

关于该代码的理解,请参照下图

出自大话数据结构

#include <stdio.h>

#define OK 1
#define ERROR 0
#define MAXSIZE 20

typedef int ElemType;
typedef int Status;

//采用枚举类型, 是为了对对操作两个栈顶指针更为明显,不至于产生歧义,或者拥有视觉混淆
typedef enum
{
	e_leftTop = 1,
	e_rightTop = 2
}TopType;

//定义共享栈的存储结构
typedef struct 
{
	ElemType data[MAXSIZE];
	int leftTop;
	int rightTop;
}Stack;

//初始化
Status InitStack(Stack *s)
{
	s -> leftTop = -1;
	s -> rightTop = MAXSIZE;
	return OK;
}

//压栈
Status Push(Stack *s, TopType type, ElemType elem)
{
	if(s -> leftTop + 1 == s -> rightTop) return ERROR;
	switch(type)
	{
		case e_leftTop:
			s -> data[s -> leftTop + 1] = elem;
			s -> leftTop++;
			break;
		case e_rightTop:
			s -> data[s -> rightTop - 1] = elem;
			s -> rightTop--;
			break;
		default :
			return ERROR;	
	}
	return OK;
}

//弹栈
Status Pop(Stack *s, TopType type, ElemType *elem)
{
	switch(type)
	{
		case e_leftTop:
			if(s -> leftTop == -1) return ERROR;
			*elem = s -> data[s -> leftTop];
			s -> leftTop --;
			break;
		case e_rightTop:
			if(s -> rightTop == MAXSIZE) return ERROR;
			*elem = s -> data[s -> rightTop];
			s -> rightTop ++;
			break;
		default:
			return ERROR;
	}
	return OK;			
}

//获取长度
int Length(Stack s)
{
	return s.leftTop + 1 + MAXSIZE - s.rightTop; 
}

//清空
Status Clear(Stack *s)
{
	s -> leftTop = -1;
	s -> rightTop = MAXSIZE;
	return OK;
}

int main(void)
{
	Status statu;
	Stack s;
	statu = InitStack(&s);
	if(statu == OK)
	{
		printf("%s : %d, %d\n", "InitStack", s.leftTop, s.rightTop);
		statu = Push(&s, e_leftTop, 21);
		statu = Push(&s, e_rightTop, 22);
		if(statu == OK)
		{
			printf("%s : %d, %d, %d, %d\n", "Push", s.leftTop, s.data[0], s.rightTop, s.data[MAXSIZE-1]);
			ElemType poplElem;
			ElemType poprElem;
			statu = Pop(&s, e_leftTop, &poplElem);
			statu = Pop(&s, e_rightTop, &poprElem);
			if(statu == OK)
			{
				printf("%s : %d, %d, %d, %d\n", "Pop", s.leftTop, poplElem, s.rightTop, poprElem);
				printf("%s : %d\n", "Length", Length(s));
				//statu = Push(&s, e_leftTop, 21);
				//statu = Push(&s, e_rightTop, 22);
				//printf("%s : %d\n", "Length", Length(s));
				statu = Clear(&s);
				if(statu == OK)
				{
					printf("%s : %d, %d\n", "Clear", s.leftTop, s.rightTop);
				}
			}
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值