从零开始的数据结构学习日记(三)——1.3顺序栈

1.1顺序栈

本质是顺序表的简化,入栈时先判断栈是否已满,若满则称“上溢”,出栈时需判断是否为空,栈空则为“下溢”,入栈操作S->Top+1,出栈操作S->Top-1

1.1.1顺序栈的类型

#define maxsize 1024
typedef int datatype;
typedef struct
{
	datatype data[maxsize];
	int Top;//表示栈顶位置
}SeqStack;

1.1.2顺序栈的基本操作

1.栈初始化
void InitStack(SeqStack*&S)
{
	S=(SeqStack*)malloc(sizeof(SeqStack));
	S->Top=-1;//栈顶指针置为-1,即为置空栈
}
2.置空栈
void SetNull(SeqStack*S)
{
	S->Top=-1;
}
3.判断空栈
int Empty(SeqStack)
{
	if(S->Top==-1)
	{
		return 1;
	}
	else return 0;
}
4.入栈
int Push(SeqStack*S,datatype x)
{
	if(S->Top==maxsize-1)
	{
		printf("栈上溢")return 0}
	else
	{
		S->data[++S->Top]=x;//先移动指针,即栈的高度加一
		return 1;
	}
}
5.出栈

这里和第六部分的形参都是“地址x"因为可以直接改变参数的值(虽然好像没啥用…疑惑)

int pop(Seqstack*S, datatype &x)
{
	if(S->Top=-1)
	{
		printf("栈下溢");
		return 0;
	}
	else
	{
		x=S->data[S->Top--];//先出栈再移动栈顶指针位置
		return 1;
	}
}
6.取栈顶元素
int GetTop(SeqStack*S, datatype&x)
{
	if(S->Top==-1)
	{
		printf("栈下溢")return 0;
	}
	else
	{
		x=S->data[S->Top];
		return 1;
	}
}

1.1.3多个顺序栈共享连续空间

为了避免某个栈上溢,可以让这些栈共享一个连续空间,代码如下:

typedef struct
{
	datatype v[maxsize];
	int Top1,Top2;
}SeqStack;
SeqStack*S=(SeqStack*)malloc(sizeof(SeqStack));

将两个栈的栈底固定在一维连续空间的两端,从栈顶向中间延伸.
将元素插入i号栈代码如下:

void push(SeqStack*S,datatype x,int i)
{
	if(S->Top+1==S->Top2)
	{
		printf("数组空间已满,发生上溢")}
	else if(i==1)
	{
		S->Top1++;
		S->v[S->Top1]=x;//入一号栈
	}
	else
	{
		S->Top2--;//这里需要留意,Top2是从一维连续空间逆向排列的所以需要减一
		S->v[S->Top2]=x;//入二号栈
	}
}

出栈算法如下:

datatype pop(SeqStack*S, int i)
{
	datatype x;
	if(i==1)
	{
		if(S->Top1==-1)
		{
			printf("xiayi");
		}
		else
		{
			x=S->v[S->Top1];
			S->Top1--;//1号栈出栈
		}
	else if(S->Top2==-1)
		{
			prnintf("xiayi");
		}
		else
		{
			x=S->v[S->Top2];
			S->Top2++;//2号栈出栈
		}
		return x;
	}
}

当Top1=-1时,一号栈为空,当Top2=maxsize时,二号栈为空。2号栈出栈应该加1,1号栈出栈应该减1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值