共享栈:
一个数组实现两个栈,第一个栈是开头,第二个栈是结尾:
用c语言实现,很简单,两个指针一个数组就够了,上代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define N 100
typedef int shareStackDataType;
typedef struct shareStack{
shareStackDataType data[N];//实现两个栈的数组
int top1;
int top2;
}shareStack;
void shareInit(shareStack* s)
{
assert(s);//断言s指针
s->top1 = -1;
s->top2 = N;
return;
}
void push1(shareStack* s, shareStackDataType value)
{
assert(s);
if (s->top1 >= s->top2)//判满
{
printf("栈满");
return;
}
s->data[++s->top1] = value;
return;
}
void push2(shareStack* s, shareStackDataType value)
{
assert(s);
if (s->top1 >= s->top2)
{
printf("栈满");
return;
}
s->data[--s->top2] = value;
return;
}
shareStackDataType pop1(shareStack* s)
{
assert(s);
if (shareEmpty1(s))//判空
{
printf("栈空");
return 0;
}
return s->data[s->top1--];
}
shareStackDataType pop2(shareStack* s)
{
assert(s);
if (shareEmpty2(s))
{
printf("栈空");
return 0;
}
return s->data[s->top2++];
}
int shareEmpty1(shareStack* s)
{
return s->top1 == -1;
}
int shareEmpty2(shareStack* s)
{
return s->top2 == N;
}
shareStackDataType peek1(shareStack* s)
{
assert(s);
if (shareEmpty1(s))
{
printf("栈空");
return 0;
}
return s->data[s->top1];
}
shareStackDataType peek2(shareStack* s)
{
assert(s);
if (shareEmpty2(s))
{
printf("栈空");
return 0;
}
return s->data[s->top2];
}
int main()
{
shareStack s;
shareInit(&s);
push1(&s, 1);
push1(&s, 2);
push1(&s, 3);
push1(&s, 4);
push2(&s, 5);
push2(&s, 6);
printf("%d", pop1(&s));//4
printf("%d", pop1(&s));//3
printf("%d", pop2(&s));//6
printf("%d", pop2(&s));//5
printf("%d", pop1(&s));//2
printf("%d", peek1(&s));//1
system("pause");
return 0;
}