数组有两个端点,两个栈有两个栈底,让一个栈的栈底在数组的开始端,即下标为0的地方;让另外一个在栈底在数组的末端,即下标为n-1的地方,如果两个栈增加元素,就是两端点向中间的延伸。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define Maxsize 100
typedef struct SeqStack{
int data[Maxsize];
int top1; //栈1的栈顶指针
int top2; //栈2的栈顶指针
}SHRSTACK;
void init(SHRSTACK* S)
{
S->top1 = 0;//栈1的栈顶指针指向数组始端
S->top2 = Maxsize - 1;//栈2的栈顶指针指向数组末端
}
bool push(pSeqS S, int val, int stackNum)
{
if(S->top1 + 1 == S->top2)//栈1的栈顶指针+1等于栈2的栈顶指针,即为栈满
{
printf("stack full!\n");
return false;
}
if(stackNum == 0)//栈1
S->data[S->top1++] = val;
if(stackNum == 1)//栈2
S->data[S->top2--] = val;
return true;
}
bool pop(pSeqS S, int *val, int stackNum)
{
if(stackNum == 0)
{
if(S->top1 == 0)
{
printf("栈1为空\n");
return false;
}
*val = S->data[S->top1--];
else if(StackNum == 1)
{
if(S->top2 == Maxsize-1)
{
printf("栈2为空\n");
return false;
}
*val = S->data[S->top2++];
}
return true;
}
void traverse(pSeqS S)
{
int i;
printf("stack1:");
for(i=0; i<S->top1; i++)
printf("%d ", S->data[i]);
printf("\n");
printf("stack2:");
for(i=S->top2; i<Maxsize; i++)
printf("%d ", S->data[i]);
printf("\n");
}
int main(void)
{
SeqS S;
int val;
init(&S);
push(&S,1,0);
push(&S,2,0);
push(&S,3,0);
push(&S,11,1);
push(&S,22,1);
push(&S,33,1);
traverse(&S);
// pop(&S,&val);
// traverse(&S);
}