数据结构(C语言):双向栈的操作函数

一、相关头文件及宏定义

#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int ElemType;
#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1

二、双向栈结构体

typedef struct Stack {//双向栈结构体
	ElemType* data;//数组首地址
	int top1;//左堆栈栈顶指针
	int top2;//右堆栈栈顶指针
	int len;//栈的长度
};

三、双向栈的初始化函数

void InitStack(Stack* s)//初始化
{
	printf("请输入需要初始化的双向栈的长度:");
	scanf("%d", &s->len);
	s->data = (ElemType*)malloc(sizeof(ElemType) * s->len);
	s->top1 = 0;
	s->top2 = s->len - 1;
}

四、入栈操作

Status Push(Stack* s, int i, int x)//入栈 i=0代表左堆栈,i=1代表右堆栈
{
	if (s->top1 > s->top2)//判断是否栈满
		return ERROR;
	switch (i) 
	{
		case 0://左堆栈
			s->data[s->top1] = x;
			s->top1++;
			break;
		case 1://右堆栈
			s->data[s->top2] = x;
			s->top2--;
			break;
	}
	return OK;
}

五、出栈操作

Status Pop(Stack* s, int i)//出栈 i=0代表左堆栈,i=1代表右堆栈
{
	switch (i)
	{
		case 0://左堆栈
			if (s->top1 == 0)//判断左堆栈是否已空
				return ERROR;
			s->top1--;
			break;
		case 1://右堆栈
			if (s->top2 == s->len - 1)//判断右堆栈是否已空
				return ERROR;
			s->top2++;
			break;
	}
	return OK;
}

六、输出堆栈的操作

void PrintStack(Stack* s,int i)
{
	switch (i)
	{
		case 0:
			printf("左堆栈:");
			for(int i = 0; i < s->top1; i++)
				printf("%d ", s->data[i]);
			printf("\n");
			break;
		case 1:
			printf("右堆栈:");
			for (int i = s->len-1; i > s->top2; i--)
				printf("%d ", s->data[i]);
			printf("\n");
			break;
	}
}

七、主函数

我们并不知道上述自定义函数是否正确,所以我们通过主函数调用上述自定义函数来实现一系列操作,以此来测试自定义函数的正确性。

int main()
{
	Stack* s = (Stack*)malloc(sizeof(Stack));
	InitStack(s);//输入示例:4
	Push(s, 0, 1);//将1弹入左堆栈
	Push(s, 0, 2);//将2弹入左堆栈
	Push(s, 1, 3);//将3弹入右堆栈
	Push(s, 1, 4);//将4弹入右堆栈
	PrintStack(s, 0);//打印左堆栈
	PrintStack(s, 1);//打印右堆栈
	Pop(s, 0);//对左堆栈进行出栈操作
	Pop(s, 1);//对右堆栈进行出栈操作
	PrintStack(s, 0);//打印左堆栈
	PrintStack(s, 1);//打印右堆栈
	return 0;
}

八、运行结果

运行代码后我们发现,自定义函数是没有问题的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值