顺序存储的双栈共享

本文介绍了一种使用单个数组实现两个独立栈的数据结构——双端共享栈,并提供了详细的初始化、进栈、出栈及取栈顶元素的操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源mooc西北大学视频教程

一 建栈操作

 #define SMax 10

typedef struct Stack
{
int Data[SMax];
int Top[2];

}Stack,*PStack;

Data栈存储数据域,SMax是共享栈的大小,Top[0]是底栈栈顶指示表示,Top[1]是顶栈栈顶指示标志。(就当做指针说好理解表达)

二 初始化栈。

void StackInit(PStack stack)
{
stack->Top[0] = -1;
stack->Top[1] = SMax;


}


三 进栈操作

bool StackPush(PStack stack, int i,int x)
{
if (stack->Top[0] + 1 == stack->Top[1])
return false;
switch (i)
{
case 0:stack->Top[0]++; stack->Data[stack->Top[0]] = x; break;
case 1:stack->Top[1]--; stack->Data[stack->Top[1]] = x; break;
default:
return false;
}
return true;
}

首先判栈是否满栈 满栈条件就是  底栈栈顶指针 是否与 顶栈栈顶指针相邻 

四 出栈操作  先判断是哪个栈要出 是底栈还是顶栈  如果先判断栈是否是空的话 麻烦一点 考虑底栈跟顶栈其中一个不空,另外一个空的情况

bool StackPop(PStack stack, int i, int &x)
{
switch (i)
{
case 0:
if (stack->Top[0] == -1)
return false;
x = stack->Data[stack->Top[0]];
stack->Top[0]--;
break;
case 1:
if (stack->Top[1] == SMax)
return false;
x = stack->Data[stack->Top[1]];
stack->Top[1]++;
break;
default:
return false;
}
return true;
}

五 取栈顶操作 同出栈操作相似 除去栈顶指针移动语句即可

bool StackPopTop(PStack stack, int i, int &x)
{
switch (i)
{
case 0:
if (stack->Top[0] == -1)
return false;
x = stack->Data[stack->Top[0]];
break;
case 1:
if (stack->Top[1] == SMax)
return false;
x = stack->Data[stack->Top[1]];
break;
default:
return false;
}
return true;
}


整理代码如下

#define SMax 10
typedef struct Stack
{
	int Data[SMax];
	int Top[2];
}Stack,*PStack;

void StackInit(PStack stack)//初始化栈
{
	stack->Top[0] = -1;
	stack->Top[1] = SMax;
}

bool StackPush(PStack stack, int i,int x)
{
	if (stack->Top[0] + 1 == stack->Top[1])//判栈满操作
		return false;
	switch (i)
	{
	case 0:stack->Top[0]++; stack->Data[stack->Top[0]] = x; break;
	case 1:stack->Top[1]--; stack->Data[stack->Top[1]] = x; break;
	default:
		return false;
	}
	return true;
}

bool StackPop(PStack stack, int i, int &x)
{
	switch (i)
	{
	case 0:
		if (stack->Top[0] == -1)
			return false;
		x = stack->Data[stack->Top[0]];
		stack->Top[0]--;
		break;
	case 1:
		if (stack->Top[1] == SMax)
			return false;
		x = stack->Data[stack->Top[1]];
		stack->Top[1]++;
		break;
	default:
		return false;
	}
	return true;
}
bool StackPopTop(PStack stack, int i, int &x)
{
	switch (i)
	{
	case 0:
		if (stack->Top[0] == -1)
			return false;
		x = stack->Data[stack->Top[0]];
		break;
	case 1:
		if (stack->Top[1] == SMax)
			return false;
		x = stack->Data[stack->Top[1]];
		break;
	default:
		return false;
	}
	return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值