一、相关头文件及宏定义
#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;
}
八、运行结果
运行代码后我们发现,自定义函数是没有问题的。