*在学习栈的过程中,如果有两个相同元素类型的栈(一长一短)那么如果分配一个相同大小的maxsize,很容易造成一个栈没有只有很少的元素而另一个栈达到了maxsize。如何解决这个问题,我在《大话数据结构》一书中找到了解决方案,双栈公用一个较大的存储空间,使一个栈的栈底处于数组的0位,另一个栈的栈底处于(maxsize-1)位
如图所示*
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define maxsize 20 /* 存储空间初始分配量 */
typedef int status;
typedef int elemtype;
typedef struct doustack{
elemtype data[maxsize];
int top1,top2;
}doustack;
//初始化栈
status initstack(doustack *s){
s->top1=-1;
s->top2=maxsize;
return OK;
}
status visit(elemtype c){
printf("%d ",c);
}
//返回栈长
status stacklength(doustack *s){
printf("栈1的长度为%d\n",s->top1+1);
printf("栈2的长度为%d\n",maxsize-(s->top2));
return OK;
}
//判断栈是否为空
status emptystack(doustack *s){
if(s->top1==-1){
printf("栈1为空\n");
}
else{
printf("栈1非空\n");
}
if(s->top2==maxsize){
printf("栈2为空\n");
}
else{
printf("栈2非空\n");
}
return OK;
}
//将元素压入栈中
status push(doustack *s,elemtype data,int stacknumber){
/*//判断栈是否已满
if(s->top1+1==s->top2){
printf("栈已满\n");
return ERROR;
}
//压入1栈
if(stacknumber==1){
s->top1++;
s->data[s->top1]=data;
}
//压入2栈
if(stacknumber==2){
s->top2--;
s->data[s->top2]=data;
}
return OK;*/
if(s->top1+1==s->top2){
return ERROR;
printf("栈已满\n");
}
if(stacknumber==1){
s->top1++;
s->data[s->top1]=data;
}
if(stacknumber==2){
s->top2--;
s->data[s->top2]=data;
}
}
//元素出栈
status pop(doustack *s,elemtype data,int stacknumber){
if(stacknumber==1){
if(s->top1==-1)
return ERROR;
data=s->data[s->top1];
s->top1--;
printf("出栈元素为%d\n",data);
}
if(stacknumber==2){
if(s->top2==maxsize)
return ERROR;
data=s->data[s->top2];
s->top2++;
printf("出栈元素为%d\n",data);
}
}
//遍历栈
status traversestack(doustack *s){
if(s->top1==-1){
return ERROR;//判空栈
}
else{
int i=0;
while(i<=s->top1){
visit(s->data[i]);
i++;
}
}
printf("\n");
if(s->top2==maxsize){
return ERROR;
}
else{
int i=s->top2;
while(i<maxsize){
visit(s->data[i]);
i++;
}
}
printf("\n");
}
int main(void){
doustack s;
initstack(&s);
stacklength(&s);
int i;
for(i=0;i<maxsize/2;i++){
push(&s,i,1);
}
for(i=maxsize;i>maxsize/2;i--){
push(&s,i,2);
}
traversestack(&s);
pop(&s,i,1);
pop(&s,i,2);
traversestack(&s);
stacklength(&s);
}