我有以下代码来查找堆栈中的最大值。它工作但我应该使用另一种方法来查找最大值,因为在调用getMax()函数后,我无法显示堆栈a。
int Sorter:: getMax(){
c.push(a.top());
a.pop();
while(!a.empty()){
if(a.top() > c.top()){
c.pop();
c.push(a.top());
a.pop();
}
else
a.pop();
}
return c.top();
}
答案 0 :(得分:3)
查找堆栈最大值的O(1)
时间和内存方法如下:
max(st.top().value, st.top().maxValue)
因此,您可以在O(1)
时间和内存复杂度中获取堆栈内所有元素的最大值。
伪代码:
class StackWithMax
{
struct node
{
int value; // an actual value;
int maxValue; // maximum of below elements
};
stack<node> st;
public:
void pop()
{
st.pop();
}
void push(const int &val)
{
node newNode;
newNode.value = val;
newNode.maxValue = (st.empty() == true ? -INFINITY : max(st.top().maxValue, st.top().value) );
st.push(newNode);
}
int maxStackValue() const
{
assert(st.empty() == false);
return st.top().maxValue;
}
};
答案 1 :(得分:3)
将最大值保留在边变量中:
int max = a.top();
while(!a.empty()){
c.push(a.top());
a.pop()
if(c.top() > max){
max = c.top(); // find the maximum among the values of a.
}
}
// This loop can be replaced with a.swap(c). As jogojapan mentioned.
// It is to demonstrate the principal.
while(!c.empty())
{
a.push(c.top()); // return the values back into a
c.pop();
}
return max;
答案 2 :(得分:0)
由于您已经有了工作代码,因此您需要分析这些内容。
答案 3 :(得分:0)
我要做的是查看整个堆栈并保存答案,然后使用secodn堆栈重建原始文件。
int Sorter:: getMax(){
if(a.empty)
{
//handle this however you see fit
}
int res = a.top;
//search for the maximum
while(!a.empty()){
if(a.top() > res){
res = a.top();
}
c.push(a.top());
a.pop();
}
//restore the original stack
while(!c.empty()){
a.push(c.top());
c.pop();
}
return res;
}
另外,“a”和“c”是不好的变量名。我让它们与你的代码保持一致。您可能应该使用更具描述性的内容。
答案 4 :(得分:0)
我认为如果允许使用临时变量,那么它就变得非常容易了
算法:
将堆栈A的顶部元素放入临时变量temp = StackA.top();
2.弹出堆栈A中的元素并检查它是否大于临时变量的值。
2.1如果是,将值复制到temp并将其推送到堆栈B.
2.2否则只是将值推到堆栈B
3.重复步骤2,直到堆栈A为空
我知道这看起来像一个明显的(并没有什么特别的)解决方案。但它保留了堆栈的元素,如果你想要它们以相同的顺序,那么你可以再添加一个步骤来复制堆栈B中的所有pop元素并将其推回堆栈A.