设计一个有getMin功能的栈
【题目】
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈种最小元素的操作。
【要求】
【C++实现】
方法一
使用两个栈,一个正常保存数据:stack_Data,另一个用于保存当前情况下的最小值:stack_Min。
压栈情况:
弹栈情况:
代码实现:
头函数MyStack.h:
#pragma once
#include <stack>
using namespace std;
class MyStack {
public:
//用于保存数据
stack<int> stack_Data;
//用于保存当前最小值
stack<int> stack_Min;
//弹栈
void pop() {
if (!stack_Data.empty()) {
int num = stack_Data.top();
stack_Data.pop();
if (num == getMin()) {
stack_Min.pop();
}
}
else
throw new exception("【空栈】:弹出失败!");
}
//压栈
void push(int number) {
if (stack_Min.empty())
stack_Min.push(number);
else if (number <= getMin()) {
stack_Min.push(number);
}
stack_Data.push(number);
}
//得到最小值
int getMin() {
if (stack_Min.empty())
throw new exception("【空栈】:无最小值!");
return stack_Min.top();
}
};
主函数main.cpp:
// 设计一个有getMin功能的栈.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include "MyStack.h"
using namespace std;
int main(){
cout << "|-------------------------------------------------|" << endl;
cout << "| 1. 压栈 |" << endl;
cout << "| 2. 弹栈 |" << endl;
cout << "| 3. 当前最小元素 |" << endl;
cout << "| 4. 退出 |" << endl;
cout << "|-------------------------------------------------|" << endl;
MyStack mystack;
while (1) {
int num;
cin >> num;
int min;
switch (num)
{
case 1:
cout << "请输入压栈元素:";
int number;
cin >> number;
mystack.push(number);
cout << endl;
break;
case 2:
mystack.pop();
cout << "弹栈成功!" << endl;
break;
case 3:
min = mystack.getMin();
cout << "当前最小值:" << min << endl;
break;
case 4:
return 0;
}
}
}
方法二
与一相类似,区别在于是否当压栈元素大于Min栈顶元素时,方法一是不进行压栈操作的,而方法二将会进行压栈操作,所压栈的元素是当前最小值(也就是Min栈顶元素)。
对于弹栈操作,方法一需要进行判断是否当前弹栈元素是当前最小值,而方法二直接弹出即可,无需判断。
但无论方法一还是方法二,时间复杂度都是O(1),空间复杂度都是O(n)。