2014-03-18 05:08
题目:实现一个栈,除了能进行push和pop之外,还能在O(1)时间内返回栈中最小的元素。
解法:用另一个“最小栈”存放最小的元素,每当有不小于当前最小值的元素进栈时,就代表最小值更新了(就算与当前最小值相等,也代表个数变了)。这时,同时要将最小值进栈。这个最小栈的栈顶就是最小的元素。出栈时,遇到数据栈的栈顶元素与最小栈相等时,要同时将最小栈出栈;否则只弹出数据栈即可。
代码:
1 // 3.2 Design a modified stack that in addition to Push and Pop can also provide minimum element present in the stack via Min function. 2 #include <climits> 3 #include <cstdio> 4 #include <cstring> 5 #include <stack> 6 using namespace std; 7 8 class MinStack { 9 public: 10 bool empty() { 11 return st.empty(); 12 } 13 14 void push(int val) { 15 st.push(val); 16 if (min_st.empty() || val <= min_st.top()) { 17 min_st.push(val); 18 } 19 } 20 21 void pop() { 22 if (st.empty()) { 23 return; 24 } 25 if (st.top() == min_st.top()) { 26 min_st.pop(); 27 } 28 st.pop(); 29 } 30 31 int top() { 32 if (st.empty()) { 33 return INT_MIN; 34 } 35 return st.top(); 36 } 37 38 int min() { 39 if (st.empty()) { 40 return INT_MIN; 41 } 42 return min_st.top(); 43 } 44 private: 45 stack<int> st; 46 stack<int> min_st; 47 }; 48 49 int main() 50 { 51 char s[100]; 52 int op; 53 MinStack st; 54 55 while (scanf("%s", s) == 1 && strcmp(s, "END") != 0) { 56 if (strcmp(s, "PUSH") == 0) { 57 scanf("%d", &op); 58 st.push(op); 59 printf("push=%d\n", op); 60 } else if (strcmp(s, "POP") == 0) { 61 op = st.top(); 62 st.pop(); 63 printf("pop=%d\n", op); 64 } else if (strcmp(s, "TOP") == 0) { 65 printf("top=%d\n", st.top()); 66 } else if (strcmp(s, "MIN") == 0) { 67 printf("min=%d\n", st.min()); 68 } 69 } 70 71 return 0; 72 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)