栈和队列面试题(一)

实现一个栈,要求Push(入栈),Pop(出栈),Min(返回最小值的操作)的时间复杂度为O(1)。

思想:

创建一个栈,栈中保存着入栈的值和当前栈中的最小值,每次入栈时都入栈两个值,在入栈时先比较要插入的值与栈顶值得大小,通过打擂台的思想循环去比较,最终栈顶元素就是整个栈的最小值

注意:入栈最小值与当前值时,必须先入栈当前值在入栈最小值,这样才能保证栈顶元素最小

例如:序列 9  5  2  7 入最小栈



代码实现:

#include <stdio.h>
#include <stdlib.h>
#include "seqstack.h"


typedef struct MinStack{
	SeqStack stack;//结构体变量
}MinStack;

void MinStackInit(MinStack* min_stack){
	if(min_stack == NULL){
		return;
	}
	SeqStackInit(&min_stack->stack);
}

void MinStackPush(MinStack* min_stack,SeqStackType value){
	if(min_stack == NULL){
		//非法输入
		return;
	}
	SeqStackType min = value;
	SeqStackType top;
	int ret = SeqStackTop(&min_stack->stack,&top);
	if(ret == 0){
		//当前是空栈
		return;
	}else {
		//如果是非空
		min = top < value ? top:value;
	}
	//先插入value,再插入min,才能保证栈顶为最小值
	SeqStackPush(&min_stack->stack,value);
	SeqStackPush(&min_stack->stack,min);
	return;
}

void MinStackPop(MinStack* min_stack){
	if(min_stack == NULL){
		//非法输入
		return;
	}
	SeqStackPop(&min_stack->stack);
	SeqStackPop(&min_stack->stack);
}

int MinStackTop(MinStack* min_stack,SeqStackType* value){
	if(min_stack == NULL || value == NULL){
		//非法输入
		return 0;
	}
	return SeqStackTop(&min_stack->stack,value);
}
test.c

扫描二维码关注公众号,回复: 1028698 查看本文章
#include <stdio.h>
#define TEST_HEADER printf("\n====================================%s===================================\n",__FUNCTION__)

void TestMinStack(){
	TEST_HEADER;
	MinStack min_stack;
	MinStackInit(&min_stack);
	MinStackPush(&min_stack,'a');
	MinStackPush(&min_stack,'b');
	MinStackPush(&min_stack,'c');
	MinStackPush(&min_stack,'d');

	SeqStackType value;
	int ret;
	ret = MinStackTop(&min_stack,&value);
	printf("ret expected 1,actual %d\n",ret);
	printf("value expected a,actual %c\n",value);

}

int main(){
	TestMinStack();
	return 0;
}



猜你喜欢

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