栈和队列试题总结

1、实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间 复杂度为O(1)
方法1:使用一个栈实现,交叉栈
#pragma once
#include<stdio.h>

#define MAX_VALUE 100

typedef struct MinStack{
	int array[MAX_VALUE];
	int top;
}MinStack;

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

/*两个方法:
1、一个栈,交叉栈;
2、两个栈
*/
void Init(MinStack *pMs)
{
	//一个栈
	pMs->top = 0;
}

void Push(MinStack *pMs, int data)
{
	//一个栈
	int min = data;
	if (pMs->top != 0 && pMs->array[pMs->top - 1] < min){
		min = pMs->array[pMs->top - 1];
	}
	pMs->array[pMs->top++] = data;//先放普通数据
	pMs->array[pMs->top++] = min;//再放当前最小数
}

void Pop(MinStack *pMs)
{
	pMs->top -= 2;
}

int Min(MinStack *pMs)
{
	return pMs->array[pMs->top - 1];
}

int Top(MinStack *pMs)
{
	return pMs->array[pMs->top - 2];
}

void test1()
{
	MinStack ms;
	Init(&ms);

	int arr[] = { 3, 2, 5, 6, 8, 3, 1, 9 };
	for (int i = 0; i < sizeof(arr) / sizeof(int); i++){
		Push(&ms, arr[i]);
	}

	printf("%d ", Min(&ms));
	Pop(&ms);
	printf("%d ", Min(&ms));
	Pop(&ms);
	printf("%d ", Min(&ms));
}

方法2:使用两个栈
#pragma once
#include<stdio.h>

#define MAX_VALUE 100

//两个栈
typedef struct MinStack{
	int array1[MAX_VALUE];
	int top1;//普通数据
	int array2[MAX_VALUE];
	int top2;//最小数据
}MinStack;

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

/*两个方法:
1、一个栈,交叉栈;
2、两个栈
*/
void Init(MinStack *pMs)
{
	//两个栈
	pMs->top1 = pMs->top2 = 0;
}

void Push(MinStack *pMs, int data)
{
	//两个栈
	/*int min = data;
	if (pMs->top2 != 0 && pMs->array2[pMs->top2 - 1] < data) {
	min = pMs->array2[pMs->top2 - 1];
	}

	pMs->array1[pMs->top1++] = data;
	pMs->array2[pMs->top2++] = min;*/

	//不再每次都入最小栈
	pMs->array1[pMs->top1++] = data;
	if (pMs->top2 == 0 || data <= pMs->array2[pMs->top2 - 1]) {
		pMs->array2[pMs->top2++] = data;
	}
}

void Pop(MinStack *pMs)
{
	/*pMs->top1--;
	pMs->top2--;*/

	//不再每次都入最小栈
	if (pMs->array1[pMs->top1 - 1] == pMs->array2[pMs->top2 - 1]) {
		pMs->top2--;
	}
	pMs->top1--;
}

int Min(MinStack *pMs)
{
	return pMs->array2[pMs->top2 - 1];
}

int Top(MinStack *pMs)
{
	return pMs->array1[pMs->top1 - 1];
}

void test2()
{
	MinStack ms;
	Init(&ms);

	int arr[] = { 3, 2, 5, 6, 8, 3, 1, 9 };
	for (int i = 0; i < sizeof(arr) / sizeof(int); i++){
		Push(&ms, arr[i]);
	}

	printf("%d ", Min(&ms));
	Pop(&ms);
	printf("%d ", Min(&ms));
	Pop(&ms);
	printf("%d ", Min(&ms));
}
所用栈方法可见: 栈操作

猜你喜欢

转载自blog.csdn.net/tec_1535/article/details/80959364
今日推荐