设计这样的栈,常数时间内操作min,push,pop
又看了下编程之美关于此题的解法,总觉得太过繁琐,实际上只需要用一个数组来保存历届最小值即可,还可以省略掉一个下标,不需要如此麻烦。
/*
* Copyright (c) 2011 alexingcool. All Rights Reserved.
*/
#include <iostream>
using namespace std;
class Stack {
public:
Stack(int i = - 1) : position(i) {}
void push(int item) {
if(position == size - 1) {
cout << "Over Flow" << endl;
return;
}
position++;
data[position] = item;
if(position == 0) {
minValues[position] = item;
} else {
if(item < minValues[position - 1])
minValues[position] = item;
else
minValues[position] = minValues[position - 1];
}
}
void pop() {
if(position == -1) {
cout << "under flow" << endl;
return;
}
position--;
}
int min() {
if(position < 0 || position >= size) {
cout << "wrong" << endl;
return 0x80000000;
}
return minValues[position];
}
bool empty() {
if(position == -1)
return true;
else
return false;
}
private:
static const int size = 20;
int data[size];
int position;
int minValues[size];
};
void main()
{
Stack stack;
int array[] = {5, 7, 3, 1, 2, 8, 4, 6};
const int size = sizeof array / sizeof *array;
for(int i = 0; i < size; i ++) {
stack.push(array[i]);
cout << stack.min() << " ";
}
cout << endl;
while(!stack.empty()) {
cout << stack.min() << " ";
stack.pop();
}
}

被折叠的 条评论
为什么被折叠?



