C语言利用双向栈的操作实现两个栈共享一段空间并且分别存放奇偶数
题目均在sdibt acm oj上AC,参考《深入浅出数据结构和算法》教材,逐个复制即可运行,欢迎评论指正!
Description
两个栈共享一段存储空间,栈1自左向右增长,栈2自右向左增长,双向栈的存储结构如下:
# define MAXSIZE 10
typedef struct
{
ElemType data[MAXSIZE];
int top1,top2;
}DoubleStack;
编程实现输入n(1<=n <=20)个整数,若是偶数入栈1,否则入栈2。然后栈1中元素依次出栈输出,栈2中的元素依次出栈输出。
Input
第1行输入 n
第2行输入n个数,以空格分隔
Output
栈1中的元素出栈输出, 栈2中的元素出栈输出,以空格分隔
Sample Input
12
10 12 3 14 25 6 73 81 29 20 23 2
Sample Output
20 6 14 12 10 29 81 25 3
HINT:
对双向栈的操作,可以最大限度的利用栈的空间
预编译文件的声明和结构体的定义:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
typedef struct
{
int data[MAXSIZE];//栈的最大长度
int top1,top2;//栈顶元素1,2
}DoubleStack;
基本操作集:初始化、入栈/出栈。
void InitDblStack(DoubleStack *ds)//双向栈的初始化
{
ds->top1 = 0;//栈头1,置0
ds->top2 = MAXSIZE-1;//栈头2 的数字是递减的,所以设置为最长长度-1
}
void Push(DoubleStack *ds,int x,int flag){//flag是操作指示变量,指示对哪一个栈进行操作
if(ds->top1-1==ds->top2)
return;//栈满判断
switch(flag)
{
case 0:ds->data[ds->top1++]= x;break;//对栈1操作,栈顶++ 移动到下一个位置
case 1:ds->data[ds->top2--]= x;break;//对栈2操作,栈顶--
}
}
void Pop(DoubleStack *ds)//这里其实本应传一个flag的,但是为了简化,直接在pop里面输出,
//先输出栈1,再输出栈2
{
int x,y;
int i;
while(ds->top1!=0)
{
ds->top1--;
x = ds->data[ds->top1];
printf("%d ",x);
}
while(ds->top2!=MAXSIZE-1)
{
ds->top2++;
y = ds->data[ds->top2];
printf("%d ",y);
}
}
⚠:本程序直接再pop出栈函数里面直接输出,在其他类似的题目里面应该不能这样做,不规范。最好的做法应该是传入一个flag指示操作,对栈1和栈2分别操作。
主函数:
int main()
{
int number;
int i;
int temp;
scanf("%d",&number);
DoubleStack ds;
InitDblStack(&ds);
for(i=0;i<number;i++)
{
scanf("%d",&temp);
Push(&ds,temp,temp%2);
}
Pop(&ds);
return 0;
}
总结:
双向栈的初始化,对栈1和栈2的top栈顶变量的操作应该是不一样的: ds->top1 = 0;ds->top2 = MAXSIZE-1 ;
双向栈的栈满判断:if(ds->top1-1==ds->top2;return;,当然是栈1在栈2的上一个空间。这个时候所有的栈的空间都被占满
双向栈的入栈操作:ds->data[ds->top1++]= x,ds->data[ds->top2--]= x,先移动栈顶位置再存放,top1++,top2--
出栈操作和入栈操作类似,先移动指针再输出即可,遍历条件是top1!=0,top2!=maxsize,这个是栈空的状态