设计包含 min 函数的栈(栈)
要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。
解法思路:
利用两个栈,一个存放原数据,另一个存放当前栈的最小值
细节:
对于最小值的栈,当push的元素小于栈顶元素时执行push操作
当原栈进行top,pop操作时,需要将其值与最小值栈顶元素相比较,如果相等,则最小值栈也要pop
利用两个栈,一个存放原数据,另一个存放当前栈的最小值
细节:
对于最小值的栈,当push的元素小于栈顶元素时执行push操作
当原栈进行top,pop操作时,需要将其值与最小值栈顶元素相比较,如果相等,则最小值栈也要pop
#include<iostream>
#define MAX 1005
#define INF 0x3f3f3f3f
using namespace std;
class Stack{
private:
int top, Data[MAX];
public:
Stack(){
top = -1;
}
int IsFull(){
if (top == MAX - 1){
return 1;
}
return 0;
}
int IsEmpty(){
if (top == -1){
return 1;
}
return 0;
}
void Push(int num){
if (!IsFull()){
Data[++(top)] = num;
}
}
void Pop(){
if (!IsEmpty()){
top--;
}
}
int Top(){
return Data[top];
}
};
void min(Stack &MyStack,Stack &MinStack){
int cont = MyStack.Top(); MyStack.Pop();
cout << "此时栈顶元素为: " << cont << endl;
cout << "此时栈中的最小元素为: " << MinStack.Top() << endl;
if (MinStack.Top() == cont){
MinStack.Pop();
}
}
int main(){
Stack MinStack, MyStack;
for (int i = 0; i < 10; i++){
int num; cin >> num;
MyStack.Push(num);
if (MinStack.IsEmpty()){
MinStack.Push(num);
}
else {
if (MinStack.Top()>num){
MinStack.Push(num);
}
}
}
for (int i = 0; i < 5; i++){
min(MyStack, MinStack);
}
system("pause");
}
如有异议,欢迎指正,谢谢。。