四、一个数组实现两个栈(共享栈)
思想:一个数组,前半部分为栈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;
}