【数据结构】栈

1.题目

将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空;当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长(见图)。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。

 

2.代码展示(c语言)

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 6
typedef struct {
	int top[2], bot[2];
	int* array;
	int size;
}Stack;
Stack sta;
void InitStack(Stack& S)//栈初始化
{
	int*arr = (int*)malloc(sizeof(MAXSIZE));
	S.array = arr;
	S.size = MAXSIZE;
	S.top[0] = -1;
	S.bot[0] = 0;
	S.top[1] = S.size - 1;
	S.bot[1] = S.size - 1;
}
int StackEmpty(Stack stack)//判断双栈整体是否为空
{
	if (stack.top[0] == -1 && stack.top[1] == stack.size - 1)
	{
		return 1;
	}
	return 0;
}
int FullStack(Stack stack)//判断栈满,三种情况:两边都满,或左栈满,右栈满
{
	if (stack.top[0] == stack.top[1] ||stack.top[0]>stack.size || stack.top[1]<0)
	{
		return 1;
	}
	return 0;
}
int pushLeft(Stack& stack, int e)//左栈元素进栈
{
	if (FullStack(stack) == 1)
	{
		printf("栈已满不能进行进栈操作\n");
		return 0;			
	}
	stack.top[0]++;				
	stack.array[stack.top[0]] = e;	
	return 1;					
}
int pushRight(Stack& stack, int e)//右栈元素进栈
{
	if (FullStack(stack) == 1)
	{
		printf("栈已满,无法进行进栈操作\n");
		return 0;	
	}
	stack.array[stack.top[1]] = e;
	stack.top[1]--;				
	return 1;
}
void outsert(Stack S)//输出双栈
{
	for (int i = 0; i <= S.top[0]; i++)
	{
		printf("|%d|", S.array[i]);
	}
	for (int j =++ S.top[1]; j < S.size; j++)
	{
		printf("|%d|", S.array[j]);
	}
}
int main()
{
	InitStack(sta);
	printf("双栈%s空栈\n", StackEmpty(sta) == 1 ? "是" : "不是");
	int a=1;
	printf("1.元素进栈!\n");
	printf("0.退出!\n");
	while (a==1)//利用一个循环将元素压进栈
	{
		int n,k,e;
		printf("请输入序号:");
		scanf_s("%d", &n);
		switch (n)
		{
		case 0:
			{
				printf("已退出");
				a = 0;
				break;
			}
		case 1:
		{
			printf("输入0进左栈,1进右栈:");
			scanf_s("%d", &k);
			printf("请输入进栈元素:");
			scanf_s("%d", &e);
			if (k == 0)
			{
				pushLeft(sta, e);
			}
			if (k == 1)
			{
				pushRight(sta, e);
			}
			break;
		}
		}
	}
	printf("双栈%s满栈\n", FullStack(sta) == 1 ? "已" : "未"); 
	printf("双栈结果为:\n");
	outsert(sta);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值