这个问题的难点是如何使得得到栈中的最小值只需要时间O(1)的复杂度,既然时间从O(N)降到了O(1),一般情况下空间势必会多出来O(n)来赢得时间,开始自己的思路是给stack多加一个属性minValue,后来发现在变化莫测的出栈入栈的变化中,这仅仅O(1)的空间的增加无法正确的求出stack的最小值;
其实这个问题只需要在栈的数据结构上略动下手脚就可以,问题带来最大的变化是出栈后最小值如何取,我们只要保证每一次出栈后最小值也能恢复到栈顶元素入栈前的状态就可以, 所以我们在平时的仅仅表示数值的属性elem下加一个属性min,以便记录当前元素作为栈顶时的最小值,这样我们就可以取得每个时刻的最小值。
在程序方面出了点小问题开始,其实是老问题:在对定义的数据结构进行修改时要添加“&”;
代码如下:
/*
* -*- coding: utf-8 -*-
/*
* stack.cpp
*
* Created on: 2014年4月21日
* Author: szk
* todo: 算法设计第2题——设计带有min的stack,要求push,pop和getMin操作的时间复杂度均为O(1).
*/
#include <iostream>
#define STACK_MAXSIZE 100
#define TRUE 1
#define FALSE 0
#define ERROR -32767
typedef struct stackNode{
int data;
int min;
};
typedef struct stack{
stackNode *node;
int top;
};
using namespace std;
int isEmpty(stack s)
{
if(s.top == 0)
return TRUE;
else
return FALSE;
}
int isFull(stack s)
{
if(s.top == STACK_MAXSIZE)
return TRUE;
else
return FALSE;
}
void push(stack &s, int e)
{
int pos = s.top;
if(isEmpty(s))
{
s.node[pos].data = e;
s.node[pos].min = e;
// s.minValue = e;
}
else if(!isFull(s))
{
s.node[pos].data = e;
if(e < s.node[pos - 1].min)
{
s.node[pos].min = e;
// s.minValue = e;
}
else
s.node[pos].min = s.node[pos - 1].min;
}
else
{
cout << "The stack is already full!!!" << endl;
return;
}
++s.top;
}
int pop(stack &s)
{
int pos = s.top;
if(isEmpty(s))
{
cout << "The stack is empty!!!" << endl;
}
else
{
--s.top;
return s.node[pos].data;
}
return ERROR;
}
int getMin(stack s)
{
if(!isEmpty(s))
return s.node[s.top].min;
cout << "The stack is empty!!!" << endl;
return ERROR;
}
int main()
{
stack s;
s.top = 0;
push(s, 1);
push(s, 3);
push(s, 2);
cout << s.node[--s.top].min << endl;
return 0;
}