数据结构:顺序栈的基本操作和实现(一个数组实现两个栈)

本文介绍如何使用一个数组实现两个独立栈,通过巧妙地利用数组两端,实现栈的高效操作。重点讲解了栈的特性、栈满和栈空判断,以及压栈、弹栈、获取栈顶等核心操作的实现和示例。

栈的特点:

1只能在栈顶进行操作
2后进先出LIFO(last in first out)
在这里插入图片描述

栈的顺序结构结构实现

这里利用数组来实现,举一个特例,一个数组实现两个栈。从两端的出发,可以充分利用数组空间。
在这里插入图片描述
思路:
由于有两个栈,因此需要设置一个tag标志来显示当前的操作对象
判定当前栈是否满,当top2-top1==1,栈满。如果令top2==top1则会溢出。
定义宏MAXSIZE方便修改数组的大小

#include<stdio.h>
/*
	使用一个数组实现两个堆栈
	为了充分利用数组空间,从两端开始,第一个栈向数组末端生长,第二个栈向数组首端生长

	操作:1:判断栈是否为空
		  2:判断栈是否为满
		  3:若栈未满,则可进行压栈操作
		  4:若栈未空,则可进行弹栈操作
		  5: 若栈不空,获取栈顶元素
		  6: 将栈置为空栈,只需修改栈顶索引到数组首部或者尾部即可。
*/

#define MAXSIZE 100

//判断栈是否为空,返回1代表空栈,0代表非空。tag==0,操作栈1。tag==1,操作栈2;
int isEmpty(int tag,int Stack);

//判断栈是否为满,返回1代表满栈,0代表未满
int isFull(int Stack1, int Stack2);

//压栈操作,tag==0,操作栈1。tag==1,操作栈2;Stack1和Stack2指示栈顶位置
int push(int arr[], int elem,int tag,int Stack1,int Stack2);

//弹栈操作,tag==0,操作栈1。tag==1,操作栈2;Stack指示栈顶位置
int pop(int arr[], int elem, int tag, int Stack);

//获取栈顶元素,tag==0,操作栈1。tag==1,操作栈2;Stack指示栈顶位置
int getTop(int arr[], int tag, int Stack);

//遍历栈,tag==0,操作栈1。tag==1,操作栈2;Stack指示栈顶位置
void visit(int arr[],int tag,int Stack);

//将栈置为空栈,tag==0,操作栈1。tag==1,操作栈2;Stack指示栈顶位置
int Clear(int tag, int Stack);

//获取栈的长度,tag==0,操作栈1。tag==1,操作栈2;Stack指示栈顶位置
int stackLength(int tag,int Stack);

int main()
{
	int arr[MAXSIZE];
	int elem=0;

	//Stack指示栈顶元素位置
	int Stack1 = -1, Stack2 = MAXSIZE;
	int tag1 = 0, tag2 = 1;
	int top2;

	if (!isFull(Stack1, Stack2))
	{
		printf("栈1和栈2未满\n");
	}
	
	if (!isEmpty(tag1, Stack1))
	{
		printf("栈1非空\n");
	}

	if (!isEmpty(tag2,Stack2))
	{
		printf("栈2非空\n");
	}
	
	printf("\n为Stack2压入一个值为99的元素:\n");
	Stack2=push(arr, 99, tag2, Stack1, Stack2);
	
	if (!isEmpty(tag2, Stack2))
	{
		printf("栈2非空\n");
	}

	top2 = (arr, tag2,Stack2);
	printf("栈顶元素为%d\n",top2);

	printf("\nStacke2遍历结果\n");
	visit(arr, tag2,Stack2);

	printf("\n计算Stack1和Stack2的长度:\n");
	printf("Stack1的长度:%d\n", stackLength(tag1, Stack1));
	printf("Stack2的长度:%d\n", stackLength(tag2,Stack2));

	printf("\n弹出Stacke2的栈顶元素:");
	Stack2 = pop(arr,elem, tag2,Stack2);
	if (!isEmpty(tag2, Stack2))
	{
		printf("栈2非空\n");
	}
	
	return 0;
}

int isEmpty(int tag, int Stack)
{
	if (tag == 0 && Stack == -1)
	{
		printf("栈1空\n");
		return 1;
	}
	else if (tag == 1 && Stack == MAXSIZE)
	{
		printf("栈2空\n");
			return 1;
	}
	else
	{
		return 0;
	}
}

int isFull(int Stack1, int Stack2)
{
	if (Stack2 - Stack1 == 1)
	{
		printf("栈满");
		return 1;
	}
	else
	{
		return 0;
	}
}

int push(int arr[], int elem, int tag,int Stack1,int Stack2)
{
	if (isFull(Stack1, Stack2))
	{
		if (tag == 0)
		{
			return Stack1;
		}
		else
		{
			return Stack2;
		}
	}
	else
	{
		if (tag == 0)
		{
			arr[++Stack1] = elem;
			return Stack1;
		}
		else
		{
			arr[--Stack2] = elem;
			return Stack2;
		}
	}
}

int pop(int arr[], int elem, int tag, int Stack)
{
	if (tag==0)
	{
		if (isEmpty(tag, Stack))
		{
			return Stack;
		}
		else
		{
			printf("弹出元素为:%d\n", arr[Stack--]);
			return Stack;
		}
	}
	else
	{
		if (isEmpty(tag, Stack))
		{
			return Stack;
		}
		else
		{
			printf("弹出元素为:%d\n", arr[Stack++]);
			return Stack;
		}
	}
}

int getTop(int arr[],int tag, int Stack)
{
	if (tag == 0)
	{
		if (isEmpty(tag, Stack))
		{
			return 0;
		}
		else
		{
			return arr[Stack];
		}
	}
	else
	{
		if (isEmpty(tag, Stack))
		{
			return 0;
		}
		else
		{
			return arr[Stack];
		}
	}

}

void visit(int arr[], int tag, int Stack)
{
	int i;
	
	if (tag == 0)
	{
		if (isEmpty(tag, Stack))
		{
			printf("栈为空,无法遍历\n");
			return 0;
		}

		for (i = 0; i < Stack; i++)
		{
			printf("%d\n", arr[i]);
		}
		printf("遍历完成\n");
		return 0;
	}
	else
	{
		if (isEmpty(tag, Stack))
		{
			printf("栈为空,无法遍历\n");
			return 0;
		}

		for (i =Stack; i <MAXSIZE; i++)
		{
			printf("%d\n", arr[i]);
		}
		printf("遍历完成\n");
		return 0;
	}
}

//将栈置为空栈
int Clear(int tag, int Stack)
{
	if (tag == 0)
	{
		Stack = -1;
		return Stack;
	}
	else
	{
		Stack = MAXSIZE;
		return Stack;
	}
}

int stackLength(int tag, int Stack)
{
	if (tag == 0)
	{
		return Stack+1;
	}
	else
	{
		return MAXSIZE - Stack;
	}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下坠丷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值