注:微软面试100题系列中的题都是v_JULY_v(http://blog.csdn.net/v_JULY_v)收集的面试题,具体PDF下载地址为:http://download.csdn.net/detail/v_july_v/4583815
写文的目的是锻炼自己,欢迎各位大牛提出建议,批评指正~
第二题,题目如下:
设计包含 min函数的栈,
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素,
要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。
我的思考过程是这样的:
1.得到栈的最小元素,且时间复杂度为0(1),那么明显需要空间来保存当前的最小值;
2.必须在每次push进去的时候,都使用空间来保留当前的最小值,这样每次pop的时候都不再需要重复比较栈中剩余各值的大小;
3.是栈就有空间的大小限制。
代码如下:
//written by zero #include<iostream> #include<cstdlib> #include<string> using namespace std; //栈中的最小元素 struct Item { int value; int min; //当前栈中最小 }; //定义栈 class Stack { public: explicit Stack(int size):curCount(0),size(size) { data = new Item[size]; }; ~Stack(){delete[] data;}; void Push(int value) { if (curCount == size) { cout << "error:stack is full" << endl; return; } data[curCount].value = value; if (curCount == 0) data[curCount].min = data[curCount].value; else data[curCount].min = data[curCount].value < data[curCount-1].min ? data[curCount].value : data[curCount-1].min; ++curCount; } void Pop() { if (curCount == 0) { cout << "error:stack is empty" << endl; return; } --curCount; } string Min() { if (curCount == 0) { return "error:stack is empty"; } char str[32]; itoa(data[curCount-1].min,str,10); return str; } private: Item *data; int size; int curCount; }; //测试栈 int main() { Stack stack(3); //设置大小为3 stack.Push(8); cout << "min:" << stack.Min() << endl; //应该输出8 stack.Push(5); cout << "min:" << stack.Min() << endl; //应该输出5 stack.Push(3); stack.Push(3); //应该报错,栈满 cout << "min:" << stack.Min() << endl; //应该输出3 stack.Pop(); cout << "min:" << stack.Min() << endl; //应该输出5 stack.Pop(); cout << "min:" << stack.Min() << endl; //应该输出8 stack.Pop(); stack.Pop(); //应该报错,栈空 cout << "min:" << stack.Min() << endl; //应该报错,栈空 }
运行截图: