持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
一、题目
描述:
定义栈的数据结构,请在该类型中实现—个能够得到栈中所含最小元素的min函数,输入操作时保证pop、top和min函数操作时,栈中一定有元素。
此栈包含的方法有:
push(value):将value压入栈中
pop():弹出栈顶元素
top():获取栈顶元素
min():获取栈中最小元素
#include <iostream>
#include <stack>
using namespace std;
class QyStack {
public:
void push(int value) {
}
void pop() {
}
int top() {
}
int min() {
}
int exec(string action){
return -1;
}
};
int main(int, char*[])
{
QyStack qys;
qys.exec("PSH-1");
qys.exec("PSH2");
cout << "expect: -1 2 1 -1" << endl;
cout << "reality: ";
cout << qys.exec("MIN") << ' ';
cout << qys.exec("TOP") << ' ';
qys.exec("POP");
qys.exec("PSH1");
cout << qys.exec("TOP") << ' ';
cout << qys.exec("MIN") << endl;
}
二、分析
首先是对命令的解析,通过首字母可以分辨出TOP和MIN,通过第二个字母可以分辨POP和PSH。
其次,由题意可知,除了传统的栈操作之外,我们还得实现min函数。
想要获取最小值最容易想到是去排序,但由于是栈结构,所以不能改变元素的顺序。
如果想兼而得之,那我们只能采用双重结构来保存数据,这样一个用来保存栈顺序,一个用来保存最小值顺序。
三、模拟
- PSH-1
正常栈:-1
最小栈:-1 - PSH2
正常栈:-1 2
最小栈:-1 -1 - POP
正常栈:-1
最小栈:-1 - PSH1
正常栈:-1 1
最小栈:-1 -1
四、实现
class QyStack {
public:
stack<int> data;
stack<int> mini;
void push(int value) {
data.push(value);
if(mini.empty() || value < mini.top()){
mini.push(value);
}else{
mini.push(mini.top());
}
}
void pop() {
data.pop();
mini.pop();
}
int top() {
return data.top();
}
int min() {
return mini.top();
}
int exec(string action){
switch (action.at(0)) {
case 'P':{
if(action.at(1) == 'S'){
push(atoi(action.substr(3).data()));
}else{
pop();
}
}break;
case 'T': return top();
default: return min();
}
return -1;
}
};
五、结言
只要能想到用最小栈来应付MIN函数,这道题就已经非常简单了,主要还是思维的活跃性。
创作不易,留个赞再走吧!如果对文章内容有任何指正,欢迎评论!