练习3.21 一个数组两个站栈
#include<stdio.h> #include<stdlib.h> struct Node; typedef struct Node *PtrToDStack; struct Node{ int top1,top2; int Capacity; int *Array; }; PtrToDStack CreateStack( int Size ) { PtrToDStack s; s = malloc( sizeof( struct Node ) ); s->Array = malloc( sizeof( int ) * Size ); s->Capacity = Size; return s; } void Initial( PtrToDStack s, int k ) { if( k = 0 ) s->top1 = -1; else s->top2 = s->Capacity; } int IsEmpty( PtrToDStack s, int k ) { if( k == 0 ) return s->top1 == -1; else return s->top2 == Size; } int IsFull( PtrToDStack s ) { return s->top1 + 1 == s->top2; } void Push( PtrToDStack s, int k, int x ) { if( !IsFull( s ) ) { if( k == 0 ) s->Array[ ++s->top1 ] = x; else s->Array[ --s->top2 ] = x; } else Error("stack is full"); } void Pop( PtrToDStack s, int k ) { if( k == 0 ) { if( !IsEmpty( s, 0 ) ) s->top1--; else Error(""); } else { if( !IsEmpty( s, 1 ) ) s->top2--; else Error("no ele") } } int Top( PtrToDStack s, int k ) { if( k == 0 ) { if( !IsEmpty( s, k ) ) return s->Array[ s->top1 ]; else Error; } else { if( !IsEmpty(s,k) ) return s->Array[ s->top2 ]; else Error; } }
个人觉得在Top和Pop处IsEmpty有点冗杂,下次把两个指针都放进一个数组里面top[0],top[1]分别表示左栈和右栈
代码的复用一下就高了
单数组双栈迎面镇长的好处:可以最大化利用数组,减少溢出(我不造)
我猜在push里面,IsFull的判断,如果满了,就发出溢出声明