栈和队列面试题(四)

四、一个数组实现两个栈(共享栈)

思想:一个数组,前半部分为栈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;
}


猜你喜欢

转载自blog.csdn.net/liru_1996/article/details/80076261