四、一个数组实现两个栈(共享栈)
思想:一个数组,前半部分为栈1,后半部分为栈2,栈1往后插入栈2往前插入;
代码实现:
#include <stdio.h> #define SharedStackMaxSize 1000 typedef char SharedStackType; //[0,top1)区间表示第一个栈 //[top2,SharedStackMaxSize)区间表示第二个栈 typedef struct SharedStack { SharedStackType data[SharedStackMaxSize]; size_t top1; size_t top2; }SharedStack; void SharedStackInit(SharedStack* stack){ if(stack == NULL){ return; } stack->top1 = 0; stack->top2 = SharedStackMaxSize; } void SharedStackPush1(SharedStack* stack,SharedStackType value){ if(stack == NULL){ //非法输入 return; } if(stack->top1 == stack->top2){ //栈已经满了,不能再入栈了 return; } stack->data[stack->top1] = value; stack->top1++; return; } void SharedStackPush2(SharedStack* stack,SharedStackType value){ if(stack == NULL){ return; } if(stack->top1 == stack->top2){ //栈满 return; } stack->top2--; stack->data[stack->top2] = value; return; } //返回0表示取栈顶元素失败,返回1表示取值成功 int SharedStackTop1(SharedStack* stack,SharedStackType* value){ if(stack == NULL || value == NULL){ //非法输入 return 0; } if(stack->top1 == 0){ //空栈 return 0; } *value = stack->data[stack->top1 - 1]; return 1; } int SharedStackTop2(SharedStack* stack,SharedStackType* value){ if(stack == NULL || value == NULL){ //非法输入 return 0; } if(stack->top2 == SharedStackMaxSize){ //空栈 return 0; } *value = stack->data[stack->top2]; return 1; } void SharedStackPop1(SharedStack* stack){ if(stack == NULL){ return; } if(stack->top1 == 0){ //空栈 return; } stack->top1--; return; } void SharedStackPop2(SharedStack* stack){ if(stack == NULL){ return; } if(stack->top2 == SharedStackMaxSize){ return; } stack->top2++; return; }
test.c
#include <stdio.h> #define TEST_HEADER printf("\n=============================%s=============================\n",__FUNCTION__) void SharedStackPrintChar(SharedStack* stack , const char* msg){ printf("[%s]\n",msg); int i = 0; for(i=0;i<stack->top1;i++){ printf("[%c] ",stack->data[i]); } printf("\n"); for(i=SharedStackMaxSize-1;i>=stack->top2;i--){ printf("[%c] ",stack->data[i]); } printf("\n"); } void TestSharedStack(){ TEST_HEADER; SharedStack stack; SharedStackInit(&stack); SharedStackPush1(&stack,'a'); SharedStackPush1(&stack,'b'); SharedStackPush2(&stack,'c'); SharedStackPush2(&stack,'d'); SharedStackPrintChar(&stack,"共享栈入栈四个元素"); SharedStackType value; int ret1 = SharedStackTop1(&stack,&value); printf("ret1 expected 1,actual %d\n",ret1); printf("value expected b ,actual %c\n",value); SharedStackPop1(&stack); SharedStackPrintChar(&stack,"栈1出栈一个元素"); int ret2 = SharedStackTop2(&stack,&value); printf("ret2 expected 1 ,actual %d\n",ret2); printf("value expected d,actual %c\n",value); SharedStackPop2(&stack); SharedStackPrintChar(&stack,"栈2出栈一个元素"); } int main(){ TestSharedStack(); return 0; }