栈在O(1)时间内求min值

思路:1:在stack的数据结构中加两个个字段,如

typedef struct { 

int data[MAX];   // 存储栈中的所有数

int top;   // 存储栈顶元素在data数组中的位置

int min;  // 最小值

int second;  // 次小值

}stack;

pop,push的时候都去栈顶元素,所以是O(1)

min的时候取stack的min字段,所以也是O(1)

每次push的时候进行比较,如果当前push的元素比stack->min小,则用当前元素替换stack->min,用原来的min替换second。如果当前push的元素比stack->min大,但比second小,则用当前元素替换stack->second。于是达到了取min的效果,程序如下

int push(stack * s,int x){

ASSERT(s!=NULL);

if(s->top>=MAX) // 防止栈溢出

{

printf("Stackoverload!");

return -1;

}

s->data[s->top++]=x;  // push的基本功能,把x压入栈,栈顶元素的位置自增1

if(x < s->min)  // 如果新压入的x比当前min小,则替换min

s->second = s->min;

s->min=x; 

       else if(x< s->second) //
否则,如果x还比second小,这替换second

              s->second= x;

// 否则,min和second都不变

return 0;

}

每次pop的时候进行比较,如果pop的元素为min,则用second替换min(这里用到了second)。于是达到了取min的效果,程序如下

int pop(stack *s,int *x)

{

ASSERT(s!=NULL);

if(s->top<=0)

{

printf("StackEmpty!");

return -1;

}

(*x) =s->data[s->top--];   // pop的基本功能,把x出栈,栈顶元素的位置自减1

if(x==s->min)  // 如果x正好等于min,那么就要把second给min

              s->min=s->second;

return 0;

}

int min( stack *s,int *x )

{

ASSERT(s!=NULL);

(*x)=s->min;

return 0;

}

 思路2:设置辅助栈ass,记录每个状态下的最小值,每次插入时,得到辅助栈当前值,和插入的值比较

如果小则插入到最小值栈的就是它,否则就是原来的最小值,通过这种方式,pop,push,min三个都是

O(1)算法的。 

    如果还需要求最大值,那么就另外再设置一个ass2来记录当前栈的最大值。

typedef struct {

int data[MAX];

int top;

}stack;

STATIC int push_stack(stack *s,int x)

{

ASSERT((s!=NULL));

if(s->top>=MAX)

{

printf("Stack overload");

return -1;

}

s->data[s->top++]=x;

return 0;

}

STATIC int pop_stack(stack *s,int *x)

{

ASSERT(s!=NULL);

if(s->top<=0)

{

printf("Stack Empty");

return -1;

}

(*x)=s->data[s->top--];

return 0;

}

int push(stack *main,stack *ass,int x)

{

ASSERT((main!=NULL)&&(ass!=NULL));

int temp;

pop_stack(ass,&temp);

push_stack(main,x);

if(x<temp)

{

push_stack(ass,temp);

push_stack(ass,x);

}

else

{

push_stack(ass,temp);

push_stack(ass,temp);

}

return 0;

}

int pop(stack *main,stack *ass,int *x)

{

ASSERT((main!=NULL)&&(ass!=NULL));

int temp;

pop_stack(ass,&temp);

pop_stack(main,x);

return 0;

}

int min(stack *ass,int *x)

{

ASSERT((main!=NULL)&&(ass!=NULL));

pop_stack(ass,x);

push_stack(ass,(*x));

return 0;

}

时间: 2024-10-29 05:14:30

栈在O(1)时间内求min值的相关文章

关于时间的操作(Java版)——获取给定时间与当前系统时间的差值(以毫秒为单位)

import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public class Test { /** * 获取给定时间与当前系统时间的差值(以毫秒为单位) * * @author GaoHuanjie */ public long getTimeDifferenceBetweenSystemTimeAndParamTime(String paramTime) { DateFor

如果你知道时间的默认值...

[情景1]执行如下测试代码: string str; Console.WriteLine(str); //报错,使用了未赋值的局部变量"str"  ----DateTime也是这个情况 [情景2]定义实体类 class DateTimeAndStringTest { public DateTime Time { get; set; } public string StringText { get; set; } } 执行如下测试代码: DateTimeAndStringTest obj

MySQL datetime数据类型设置当前时间为默认值

环境:MySQL Sever 5.1 + MySQL命令行工具 问题:MySQL datetime数据类型设置当前时间为默认值 解决: 方法一: 由于MySQL目前字段的默认值不支持函数,所以以create_time datetime default now() 的形式设置默认值是不可能的.代替的方案是使用TIMESTAMP类型代替DATETIME类型. TIMESTAMP列类型自动地用当前的日期和时间标记INSERT或UPDATE的操作.如果有多个TIMESTAMP列,只有第一个自动更新. 自

时间的秒值和正常的时间格式转换

////  时间的秒值和正常的时间格式转换.h//  IOS笔记////  Created by 刘威成 on 15/12/8.//  All rights reserved.// // TargetTime是获取时间的秒值转换成我们常见的时间格式 for (int i = 0; i <dataArr.count; i++) {        NSString *str =  [ NSString stringWithFormat:@"%@",[dataArr objectAtI

js获取当前时间及取值操作

取值 this.divEndDate.attr("value",new Date()); var date = new Date(); date.getYear():     取2位数年份 date.getFullYear():  取4位数年份 date.getMonth(); 取月 date.getDate():  取日 date.getTime():  取当前时间(毫秒值) date.getHours():  取当前小时 date.getMinutes():  取当前分钟 date

[Swift Weekly Contest 121]LeetCode981. 基于时间的键值存储 | Time Based Key-Value Store

Create a timebased key-value store class TimeMap, that supports two operations. 1. set(string key, string value, int timestamp) Stores the key and value, along with the given timestamp. 2. get(string key, int timestamp) Returns a value such that set(

oracle计算两个时间的差值(XX天XX时XX分XX秒)

在工作中需要计算两个时间的差值,结束时间 - 开始时间,又不想在js里写function,也不想在java里去计算,干脆就在数据库做了一个函数来计算两个时间的差值.格式为XX天XX时XX分XX秒: 上代码: CREATE OR REPLACE FUNCTION F_GET_DIFF_TIME(START_TIME IN DATE, END_TIME IN DATE) RETURN VARCHAR2 IS DIFF_TIME VARCHAR2(50); BEGIN SELECT TDAY || '

Mysql中设置默认时间为当前值

1.直接在创建表时添加该列并声明默认值,如下: CREATE TABLE `table1` ( `id` int(11) NOT NULL, `createtime` timestamp NULL default CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 如果是在navicat下操作的话,设置字段的类型为timestamp,默认值写上CURRENT_TIMESTAMP,如下图: 2.在现有表中添加新列 ALTER TABLE

【栈的应用】四则运算表达式求值

1. 后缀表达式计算结果 (1) 规则 从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶的两个数字出栈,运算结果进栈,一直到最终获得结果. (2) 示例 后缀表达式:9 3 1 - 3 * + 10 2 / + 初始化一个空栈.此栈用来对要运算的数字进出使用: 后缀表达式中前三个都是数字,所以9.3.1依次进栈: 接下来是"-",所以将栈中的1出栈作为减数,3出栈作为背减数,并运算3-1得到2,再将2进栈: 接着是数字3进栈: 后面是"*&quo