思想:先开辟一段连续的存储空间(一个数组);两个栈栈顶分别指向数组的两端,随着push操作两栈的栈顶向数组内侧移动;随着pop操作两栈的栈顶向数组外侧移动。
#include <stdio.h>
#include <stdlib.h>
//栈的顺序存储结构,用一维数组实现
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;
//用一个数组来存储两个栈;思想是两个栈的栈顶分别在数组的两端
typedef struct{
ElemType data[MAXSIZE];
int top1;//栈1的栈顶
int top2;//栈2的栈顶
}DoubleStack;
//1. 初始化操作
Status InitDS(DoubleStack *DS){
memset(DS->data,'\0',sizeof(ElemType)*MAXSIZE);/*注意memset是以字节来置数的,置零时不必考虑这么多,但置其他数时必须考虑基本元素的数据类型*/
DS->top1=-1;
DS->top2=MAXSIZE;
return OK;
}
//2. 对于两栈共享空间的push方法,我们除了要插入元素值参数外,还需要有一个判断是栈1还是栈2的栈号参数
Status DoublePush(DoubleStack *DS,ElemType e,int s_number){
if(DS->top1+1==DS->top2){
//当两个栈顶重合时,数组已经满了
return ERROR;
}
if(s_number==1){
//往栈1插入元素
++(DS->top1);
DS->data[DS->top1]=e;
}else if(s_number==2){
--(DS->top2);
DS->data[DS->top2]=e;
}
return OK;
}
//两栈共享空间的pop方法
Status DoublePop(DoubleStack *DS,ElemType *e,int s_number){
if(DS->top1==-1 && DS->top2==MAXSIZE){
printf("两栈均为空!,不能执行此项操作!");
return ERROR;
}else if(DS->top1==-1){
//栈1为空,只能对2进行弹栈
if(s_number!=2){
printf("此时栈1为空,栈的标号必须为2!\n");
return ERROR;
}
}else if(DS->top2==MAXSIZE){
if(s_number!=1){
printf("此时栈2为空,栈的标号必须为1!\n");
return ERROR;
}
}
if(1==s_number){
*e=DS->data[DS->top1];
--DS->top1;
}else if(2==s_number){
*e=DS->data[DS->top2];
++DS->top2;
}else{
printf("请检查输入的栈号,必须为1或2\n");
return ERROR;
}
return OK;
}
int main()
{
DoubleStack DS;
if(OK==InitDS(&DS)){
printf("初始化成功!");
}
int e,s_number;
printf("想要插入的值及栈号\n");
while(2==scanf("%d,%d",&e,&s_number)){
if(OK==DoublePush(&DS,e,s_number)){
int i,j;
i=0;
j=MAXSIZE-1;
printf("栈1的元素为:");
while(i<=DS.top1){
printf("%d\t",DS.data[i++]);
}
printf("\n栈2的元素为:");
while(j>=DS.top2){
printf("%d\t",DS.data[j--]);
}
}
}
printf("输入出栈的栈号\n");
while(1==scanf("%d",&s_number)){
printf("出栈的值为:");
if(OK==DoublePop(&DS,&e,s_number))
printf("%d\t",e);
}
return 0;
}