最小栈的两种实现方法

原创 2018年04月16日 16:13:52

方法一:顺序栈

最小栈入栈思路:

    以9 5 7 2为例:

    

代码示例:

Min_stack.h
#include<stdio.h>
#pragma once
#define StackMAX 1000
typedef int SeqListType;

typedef struct Min_Struct{
	SeqListType data[StackMAX];
	size_t size;
}Min_Struct;

void MinstructInit(Min_Struct* stack);//最小栈的初始化
void MinStackPush(Min_Struct* stack, SeqListType value);//最小栈的入栈
void MinStackPop(Min_Struct* stack);//最小栈的出栈(出栈两次)
int MinStackTop(Min_Struct* stack, SeqListType* value);//取最小栈的栈顶元素
Min_stack.c
//代码部分
void MinstructInit(Min_Struct* stack)
{
	if (stack == NULL){
		return;
	}
	stack->size = 0;
	return;
}
int Max_judge(int* flag, int* value)
{
	return *flag > *value ? *value : *flag;
}
void MinStackPush(Min_Struct* stack, SeqListType value)
{
	if (stack == NULL){
		return;
	}
	if (stack->size >= StackMAX){
		return NULL;
	}
	if (stack->size == 0){
		stack->data[stack->size++] = value;
		stack->data[stack->size++] = value;
		return;
	}
	else{
		stack->data[stack->size++] = value;
		int flag = stack->data[stack->size - 2];
		int ret=Max_judge(&flag, &value);
		stack->data[stack->size++] = ret;
		return;
	}
}
void MinStackPop(Min_Struct* stack)
{
	if (stack == NULL){
		return;
	}
	if (stack->size == 0){
		return;
	}
	stack->size--;
	stack->size--;
	return;
}
int MinStackTop(Min_Struct* stack, SeqListType* value)
{
	if (stack == NULL){
		return 0;
	}
	if (stack->size == 0){
		return 0;
	}
	*value = stack->data[stack->size-1];
	return 1;
}
测试部分
void TestMinPush(){
	TestHeader;
	Min_Struct stack;
	MinstructInit(&stack);
	MinStackPush(&stack, 9);
	MinStackPush(&stack, 5);
	MinStackPush(&stack, 7);
	MinStackPush(&stack, 2);
	MinstackPrint(&stack, "最小栈的入栈");

}
void TestMinTop(){
	TestHeader;
	Min_Struct stack;
	MinstructInit(&stack);
	MinStackPush(&stack, 9);
	MinStackPush(&stack, 5);
	MinStackPush(&stack, 7);
	MinStackPush(&stack, 2);
	MinstackPrint(&stack, "最小栈的入栈");
	int tmp;
	int ret=MinStackTop(&stack, &tmp);
	printf("expect 1,actual %d\n", ret);
	printf("expect 2,actual %d\n", tmp);
	MinStackPop(&stack);
	int ret1 = MinStackTop(&stack, &tmp);
	printf("expect 1,actual %d\n", ret);
	printf("expect 5,actual %d\n", tmp);
}
主函数调用
int main(){
	TestMinPush();
	TestMinTop();}


方法二:链式栈

链式最小栈的思路同上面的顺序最小栈。以下为代码实现:

LinkMin_stack.h

#include<stddef.h>
#include<stdlib.h>
typedef int LinkType;
#define MaxSize 1000
typedef struct LinkNode{
	LinkType data;
	struct LinkNode* next;
}LinkNode;
typedef struct Min_Stack{
	LinkNode head;
}Min_Stack;

LinkNode* MinStackCreat(LinkType value);//开辟结点空间
void MinStackInit(Min_Stack* stack);//最小栈的初始化
void MinStackPush(Min_Stack* stack, LinkType value);//最小栈入栈
void MinStackPop(Min_Stack* stack);//最小栈出栈
int  MinStackTop(Min_Stack* stack, LinkType *value);//取最小栈栈顶元素


LinkMin_stack.c
#include<stdio.h>
LinkNode* MinStackCreat(LinkType value)
{
	LinkNode* cur = (Min_Stack*)malloc(sizeof(Min_Stack));
	cur->data = value;
	cur->next = NULL;
	return cur;
}
void MinStackInit(Min_Stack* stack)
{
	if (stack == NULL){
		return;
	}
	stack->head.data = 0;
	stack->head.next = NULL;
}
int Max_judge(int* value, int* flag){
	if (flag == NULL || value == NULL){
		return 0;
	}
	return *value > *flag ? *flag : *value;
}
void MinStackPush(Min_Stack* stack, LinkType value)
{
	if (stack == NULL){
		return;
	}
	if (stack->head.next == NULL){
		LinkNode* pre = MinStackCreat(value);
		pre->next = stack->head.next;
		stack->head.next = pre;
		LinkNode* ppre = MinStackCreat(value);
		ppre->next = stack->head.next;
		stack->head.next = ppre;
		return;
	}
	else{
		LinkNode* pre = MinStackCreat(value);
		pre->next = stack->head.next;
		stack->head.next = pre;
		LinkType flag = stack->head.next->next->data;
		int ret = Max_judge(&value, &flag);
		LinkNode* ppre = MinStackCreat(ret);
		ppre->next = stack->head.next;
		stack->head.next = ppre;
		return;
	}

}
void MinStackPop(Min_Stack* stack)
{
	//出栈两次
	if (stack == NULL){
		return;
	}
	if (stack->head.next == NULL){
		return;
	}
	LinkNode* to_delete1 = stack->head.next;
	stack->head.next = to_delete1->next;
	free(to_delete1);
	LinkNode* to_delete2 = stack->head.next;
	stack->head.next = to_delete2->next;
	free(to_delete2);
	return;
}
int  MinStackTop(Min_Stack* stack, LinkType *value)
{
	if (stack == NULL){
		return 0;
	}
	if (stack->head.next == NULL){
		return 0;
	}
	*value = stack->head.next->data;
	return 1;
}

/////////////////////////////////////////////////测试部分///////////////////////////////////////////
#define TestHeader printf("\n===============%s=====================\n",__FUNCTION__)
void MinStackPrint(Min_Stack* stack, const char* msg){
	if (stack == NULL){
		printf("stack==NULL\n");
		return;
	}
	printf("[%s]\n", msg);
	printf("[栈顶]");
	LinkNode* cur = stack->head.next;
	for (; cur != NULL; cur = cur->next){
		printf("[%d]", cur->data);
	}
	printf("[栈底]\n");
}

void TestMinstackPush()
  {
	  TestHeader;
	  Min_Stack stack;
	  MinStackInit(&stack);
	  MinStackPush(&stack, 9);
	  MinStackPush(&stack, 5);
	  MinStackPush(&stack, 7);
	  MinStackPush(&stack, 2);
	  MinStackPrint(&stack, "最小栈元素入栈");
  }
  void TestMinstackTop(){
	  TestHeader;
	  Min_Stack stack;
	  MinStackInit(&stack);
	  MinStackPush(&stack, 9);
	  MinStackPush(&stack, 5);
	  MinStackPush(&stack, 7);
	  MinStackPush(&stack, 2);
	  MinStackPrint(&stack, "最小栈元素入栈");
	  int tmp;
	  int ret=MinStackTop(&stack, &tmp);
	  printf("expect 1,actual %d\n", ret);
	  printf("expect 2,actual %d\n", tmp);
	  MinStackPop(&stack);
	  int ret1 = MinStackTop(&stack, &tmp);
	  printf("expect 1,actual %d\n", ret1);
	  printf("expect 5,actual %d\n", tmp);
  }
////////////////////////////////////////主函数调用/////////////////////////////////
int main(){
	TestMinstackPush();
        TestMinstackTop();
	  return 0;
  }


实现一个最大栈、最小栈

思路分析:在栈中实现一个方法 每一调用该方法可以获得当前栈中的最大值 通过把两个栈封装在一个栈中 其中的一个栈存放正常的元素 另一个栈max只存最大元素  如果push()一个数 如果这个数比 最大栈...
  • u013078669
  • u013078669
  • 2016-03-31 20:47:49
  • 927

算法-最小栈的实现-minStack

//栈 先入后出的集合//最小栈的实现 /*. 实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法。 要保证这三个方法的时间复杂度都是O(1)。*//* 栈...
  • softwarenb
  • softwarenb
  • 2016-12-02 20:29:19
  • 1092

实现堆栈中最小的元素getMin()

需求: 1、实现一个堆栈,具备堆栈的性质,和相关pop, push, create, peek, clear等操作 2、在1的基础上,对这个堆栈实现一个getMin()的操作,该操作get到当前堆...
  • nigel_lee_beihang
  • nigel_lee_beihang
  • 2016-12-02 15:09:31
  • 247

六、栈的实现两种方式

前言:栈的特点:先进先出,只在栈顶进行操作。栈低密封,不进行操作,栈的实现有两种方式,通过对线性表实现进行复用。安全性高。 实现栈的方式:                          第一种:以...
  • liuchuangjin
  • liuchuangjin
  • 2015-05-26 17:07:06
  • 694

java实现定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数

import java.util.Stack; /** * 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 * * @author pomay * */ publ...
  • pomay
  • pomay
  • 2017-05-16 16:00:06
  • 550

算法学习 - 最小栈的实现O(1)时间

最小栈 最小栈其实和栈没有什么区别的,唯一的区别在于最小栈是可以在O(1)时间内得到当前的栈空间里,最小的值是多少。 最小栈的操作 最小栈的操作和普通栈的操作没有太大区别,唯一多了一个方法就是g...
  • chenfs1992
  • chenfs1992
  • 2014-12-05 03:56:24
  • 4405

【C++】返回栈中最小的元素,要求时间复杂度为O(1)

返回栈中最小的元素,要求时间复杂度为O(1) 思想:  以空间换时间,用两个栈 DataStack栈中存储数据元素 MinDataStack栈中存储最小的数据元素 1.当两个栈都为空时,第一个数据元素...
  • ZDF0414
  • ZDF0414
  • 2015-11-17 14:51:03
  • 529

实现O(1)获取最大最小值的栈----java

实现O(1)获取最大最小值的栈和队列----java 一.如何实现包含获取最小值函数的栈 问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin函数。在该栈中,调用get...
  • u010093630
  • u010093630
  • 2014-08-09 22:37:44
  • 5842

剑指offer——定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

本题借助辅助栈,以及一个变量用来记录最小元素,当把元素压入栈时,比较元素与最小元素间的关系,若大于最小元素,则将最小元素压入辅助栈,此元素压入数据栈,若元素小于最小元素,则将此元素压入数据栈和辅助栈。...
  • LiYan_930603
  • LiYan_930603
  • 2017-02-22 20:55:33
  • 1260

实现可以获取最小值的栈

这个问题很简单,看看代码就懂了,这种实现不好。在OJ上主要是很容易实现。class Solution { public: stack stack1,stack2; void push...
  • Flashlucky
  • Flashlucky
  • 2017-10-06 22:21:16
  • 163
收藏助手
不良信息举报
您举报文章:最小栈的两种实现方法
举报原因:
原因补充:

(最多只允许输入30个字)