当我们需要两个栈的存储数据的时候,可能会出现其中一个栈不够用,另外一个栈又不经常使用的情况,可以试着把两个栈合体。这是一种策略,在日常生活中也有类似的情况,比如情侣,有的情侣毕业了还是分开住,有的情侣可能会想一起租房子不是更好嘛,他好,我也好。
共享栈的表示
typedef int Elemtype; typedef struct { Elemtype data[size]; int top1;//栈1指针 int top2;//栈2指针 } Stack;
操作集
入栈
/* *StackNum为栈的号数 */ int push( Stack *s , Elemtype e , int StackNum ) { if( s->top1 + 1 == s->top2 ) { return 0; } if( StackNum == 1 ) { s->data[++s->top1] = e; } else { s->data[--s->top2] = e; } return 1; }
出栈
int pop( Stack *s , Elemtype *e , int StackNum ) { if( StackNum == 1 ) { if( s->top1 == -1 ) return 0; *e = s->data[s->top1--]; } else if( StackNum == 2 ) { if( s->top2 == size ) return 0; *e = s->data[s->top2++]; } return 1; }
遍历
void display( Stack *s ) { int i; printf("栈1: "); for( i = 0 ; i <= s->top1 ; i++ ) { printf("%d ",s->data[i]); } printf(" 栈2: "); for( i = size - 1 ; i >= s->top2 ; i-- ) { printf("%d ",s->data[i]); } printf(" "); }
全部代码
#include<stdio.h> #define size 20 typedef int Elemtype; typedef struct { Elemtype data[size]; int top1;//栈1指针 int top2;//栈2指针 } Stack; void init( Stack *s ) { s->top1 = -1; s->top2 = size; } /* *StackNum为栈的号数 */ int push( Stack *s , Elemtype e , int StackNum ) { if( s->top1 + 1 == s->top2 ) { return 0; } if( StackNum == 1 ) { s->data[++s->top1] = e; } else { s->data[--s->top2] = e; } return 1; } int pop( Stack *s , Elemtype *e , int StackNum ) { if( StackNum == 1 ) { if( s->top1 == -1 ) return 0; *e = s->data[s->top1--]; } else if( StackNum == 2 ) { if( s->top2 == size ) return 0; *e = s->data[s->top2++]; } return 1; } void display( Stack *s ) { int i; printf("栈1: "); for( i = 0 ; i <= s->top1 ; i++ ) { printf("%d ",s->data[i]); } printf(" 栈2: "); for( i = size - 1 ; i >= s->top2 ; i-- ) { printf("%d ",s->data[i]); } printf(" "); } int main() { Stack L; init(&L); int n; push(&L,3,1); push(&L,4,1); push(&L,12,2); push(&L,11,2); push(&L,13,2); display(&L); pop(&L,&n,1); pop(&L,&n,2); display(&L); return 0; }