最小栈设计并实现一个MinStack类,要求至少含有以下三种方法
一、push方法:将一个整数进行压栈
二、pop方法:弹出栈顶元素
三、getmin方法:输出栈内最小元素
输入格式:
第一行输入一个N,表示接下来要操作的数量
随后N行表示操作:
push方法后跟要压栈的元素
pop方法、getmin方法后不跟任何元素
说明:假设不包含其他无效输入,以及在执行getmin、pop方法时栈不为空
样例:">样例:">样例:">样例:">样例:">输出样例:
输出栈内最小元素
输入样例:
5
push 2
push 3
push 1
pop
getmin
输出样例:
2
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
这道题其实没必要按题目定义一个MinStack类,直接栈,系统也给你判对,就完事了
方法一:
#include<bits/stdc++.h>
using namespace std;
void getmin(stack<int>c)
{
stack<int>d; //辅助栈,用于储存最小值
d.push(c.top()); //将c栈中的栈顶元素放入d栈中,用于比较
while(c.size()>0) //防止溢出
{
if(c.top()<d.top())
d.push(c.top()); //将更小的数字存入d栈中,c栈中删除该元素
c.pop(); //比较一次就删除该元素
}
cout<< d.top()<<endl; //注意队列和栈的区别,队列是从尾插入,而栈是从头插入,所以此时b栈的栈首就是最小的;
}
int main ()
{
stack<int>s;
char zl[10]; //用来判断输入的是push还是pop
int n,x;
cin>>n;
while(n--)
{
cin>>zl; //输入push或pop
if(zl[1]=='u') //push和pop第二个字符不同,我们就选择这两个字符来区分这两个单词
{
cin>>x;
s.push(x);
}
else if(zl[1]=='o')
s.pop();
else
{
getmin(s);
}
}
return 0;
}
这就没必要写类了,甚至你可以选择一个主函数写完,但是如果你想知道用类怎么写的话,那就看下面的这个代码 ,其实跟上面没差多少,就加上class minstack操作一波就ok了 ^0^
方法二:
#include<bits/stdc++.h>
using namespace std;
class minstack{
private:
stack<int> c; //名为c的栈
public:
minstack(stack<int>k) //构造
{
c=k; //用于主函数的栈s传进来
}
void getmin()
{
stack<int>d; //辅助栈,用于储存最小值
d.push(c.top()); //将c栈中的栈顶元素放入d栈中,用于比较
while(c.size()>0) //防止溢出
{
if(c.top()<d.top())
d.push(c.top()); //将更小的数字存入d栈中,c栈中删除该元素
c.pop(); //比较一次就删除该元素
}
cout<< d.top()<<endl; //注意队列和栈的区别,队列是从尾插入,而栈是从头插入,所以此时b栈的栈首就是最小的;
}
};
int main ()
{
stack<int>s;
char zl[10]; //用来判断输入的是push还是pop
int n,x;
cin>>n;
while(n--)
{
cin>>zl; //输入push或pop
if(zl[1]=='u') //push和pop第二个字符不同,我们就选择这两个字符来区分这两个单词
{
cin>>x;
s.push(x);
}
else if(zl[1]=='o')
s.pop();
else
{
minstack m(s); //把栈s传到minstack类;
m.getmin(); //调用最小栈函数求最小
}
}
return 0;
}