惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
腾讯CDC
D
Docker
G
Google Developers Blog
D
DataBreaches.Net
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
The Cloudflare Blog
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
量子位
美团技术团队
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 进击的程序员

cuowu Angular4+路由 由href return false 来看阻止默认事件 TypeScript的配置文件 tsconfig.json Java标记接口 动手编写TCP服务器系列之一:日志文件 Shell语言系列之一:文件处理 给Amazon ec2 增加卷(Volume)并挂载到系统 Java打包问题之一:打包出现java.io.IOException: invalid header field struct中长度为0的数组用途与原理 awk处理之案例六:awk根据条件插入文本 程序员的数学之余数:星期数的思考 面试题之实现系统函数系列一:实现memmove函数 awk处理之案例五:awk匹配字段2包含字段1的文本 awk处理之案例四:sort加awk来过滤文本 字符串面试题系列之七:字符串全排列 awk处理之案例三:awk去掉不需要的文本行 awk处理之案例二:awk匹配文本 awk处理之案例一:awk 处理百分比的问题
面试题之堆栈队列系列一:设计包含min函数的栈
进击的程序员 · 2013-08-11 · via 博客园 - 进击的程序员

编译环境

   本系列文章所提供的算法均在以下环境下编译通过。

【算法编译环境】Federa 8,linux 2.6.35.6-45.fc14.i686
【处理器】 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
【内存】 2025272 kB

前言

   这是一道经常遇见的面试题。好像网易和google都曾出过此题。这道题解法也胜多。这里给出普遍的一种解法。即增加一个辅助堆栈来存储最小值。

    本系列文章均系笔者所写,难免有一些错误或者纰漏,如果小伙伴们有好的建议或者更好的算法,请不吝赐教。

正文

【题目】

   定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。

【例子】

【分析】

   我第一次看到这个题目的时候,想用一个min变量保存最小的值就不OK了。再一想,如果这个最小元素被pop出去了,怎么办呢?

   因此仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。我们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。

【代码】

#ifndef STACK_HPP

#define  STACK_SIZE 20

typedef struct {
   int data[STACK_SIZE];
   int top;
   int min;
}Stack;

void init( Stack *s );
void push( Stack *s, int val );
int pop( Stack *s );
bool full( Stack *s );
bool empty( Stack *s );
int min( Stack *s );

#endif
#include <iostream>
#include <cstdio>
#include <cstring>
#include "stack.hpp"

Stack assist;

void init( Stack *s )
{
   s->top = -1;
   s->min = -1;

   assist.top = -1;
}

void push( Stack *s ,int val )
{
   if( full(s) )
   {
      printf("%s\n", "stack is full");
      return;
   }
   if( (s->min == -1) || (val < s->min) )
   {
      s->min = val;
      assist.data[++assist.top] = val;
   }
   s->data[++s->top] = val;
}

int pop( Stack *s )
{
   int data;
   if( empty(s) )
   {
      printf( "%s\n", "stack is empty" );
      return -1;
   }
   data = s->data[s->top--];
   if( data == assist.data[assist.top] )
   {
      s->min = assist.data[--assist.top];
   }
   return data;
}

bool full( Stack *s )
{
   if( s->top == STACK_SIZE-1 )
   {
      return true;
   }
   return false;
}

bool empty( Stack *s )
{
   if( s->top == -1 )
   {
      return true;
   }
   return false;
}

int min( Stack *s )
{
   return s->min;
}

int main( int argc, char ** argv )
{
   Stack s;
   init( &s );
   push( &s, 3);
   std::cout << min( &s ) << std::endl;
   push( &s, 4);
   std::cout << min( &s ) << std::endl;
   push( &s, 2);
   std::cout << min( &s ) << std::endl;
   push( &s, 1);
   std::cout << min( &s ) << std::endl;
   pop( &s );
   std::cout << min( &s ) << std::endl;
   pop( &s );
   std::cout << min( &s ) << std::endl;
   push( &s, 0);
   std::cout << min( &s ) << std::endl;
   return 0;
}

【结论】

   我们做如下测试:

排序键值字段的类型
步骤 数据栈 辅助栈 最小值
1 3 3 3
2 3,4 3 3
3 3,4,2 3,2 2
4 3,4,2,1 3,2,1 1
5 3,4,2 3,2 2
6 3,4 3 3
7 3,4,0 3,0 0

作者

   出处:http://www.cnblogs.com/gina

   本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。