C++ 在堆栈中查找最大值的进一步优化
我的问题是插入一个元素,弹出最后一个插入的元素,并打印给定元素中的最大值。我使用了两个堆栈的目的,它是优化的基础上最建议的技术可用。但是我仍然需要进一步优化查询数量qt; 字符查询; 内部细节;C++ 在堆栈中查找最大值的进一步优化,c++,stack,C++,Stack,我的问题是插入一个元素,弹出最后一个插入的元素,并打印给定元素中的最大值。我使用了两个堆栈的目的,它是优化的基础上最建议的技术可用。但是我仍然需要进一步优化查询数量qt; 字符查询; 内部细节; 对于(int test=0;test我不确定“优化”是什么意思(在您的案例中尽量减少内存使用,提高执行时间或仅参考算法效率)。下面是@alexeykuzmin0的注释,代码如下所示: std::stack<std::pair<int, int>> stack; for (int
对于(int test=0;test我不确定“优化”是什么意思(在您的案例中尽量减少内存使用,提高执行时间或仅参考算法效率)。下面是@alexeykuzmin0的注释,代码如下所示:
std::stack<std::pair<int, int>> stack;
for (int i = 0; i<q; i++)
{
std::cin >> query;
if (query == 'A')
{
std::cin >> detail;
int max = stack.empty() ? detail : std::max(detail, stack.top().second);
stack.push(std::make_pair(detail, max));
}
else if (query == 'R')
{
if (!stack.empty())
{
stack.pop();
}
}
else
{
if (stack.empty())
std::cout << "Empty\n";
else
std::cout << stack.top().second << "\n";
}
}
std::stack;
对于(int i=0;i>query;
如果(查询=='A')
{
std::cin>>详细信息;
int max=stack.empty()?细节:std::max(细节,stack.top().second);
stack.push(标准::make_pair(细节,最大值));
}
else if(查询='R')
{
如果(!stack.empty())
{
stack.pop();
}
}
其他的
{
if(stack.empty())
std::cout我不确定“优化”是什么意思(在您的案例中尽量减少内存使用,提高执行时间或仅参考算法效率)。下面是@alexeykuzmin0的注释,代码如下所示:
std::stack<std::pair<int, int>> stack;
for (int i = 0; i<q; i++)
{
std::cin >> query;
if (query == 'A')
{
std::cin >> detail;
int max = stack.empty() ? detail : std::max(detail, stack.top().second);
stack.push(std::make_pair(detail, max));
}
else if (query == 'R')
{
if (!stack.empty())
{
stack.pop();
}
}
else
{
if (stack.empty())
std::cout << "Empty\n";
else
std::cout << stack.top().second << "\n";
}
}
std::stack;
对于(int i=0;i>query;
如果(查询=='A')
{
std::cin>>详细信息;
int max=stack.empty()?细节:std::max(细节,stack.top().second);
stack.push(标准::make_pair(细节,最大值));
}
else if(查询='R')
{
如果(!stack.empty())
{
stack.pop();
}
}
其他的
{
if(stack.empty())
STD::CUT考虑使用不两个代码>堆栈 s,但是<代码>堆栈。在这种情况下,它可能会导致更好的缓存。locality@Jarod42我不明白。你在插入那些元素吗?你在执行什么操作?为什么你认为它不起作用?下面输入4a1a1rq
,你将打印“Empty”
而s
中仍然有1
。如果我们添加了以下R
,则会发生不好的情况。我假设您的输入实际上是A6 A1 rq,因此先插入6,然后删除最近的元素(1)并显示最大值。当插入6时,它将同时插入s和max堆栈中。1仅插入s。当移除时,1仅从s中移除(在max堆栈中仍保留6),因此打印max将给出6。我的输入不是您的工作案例A6 A1 R Q
,而是打印为空的A1 R Q
(如果(detail>max.top())
可能应该是如果(detail>=max.top())
)考虑不要使用两个<代码>堆栈 s,但是<代码>堆栈。在这种情况下,它可能会导致更好的缓存。locality@Jarod42我不明白。你在插入那些元素吗?你在执行什么操作?为什么你认为它不起作用?下面输入4a1a1rq
,你将打印“空”“
而s
中仍然有1
。如果我们添加了以下R
,则会发生不好的事情。我假设您的输入实际上是A6 A1 rq,因此先插入6,然后删除最近的元素(1)并显示最大值。当插入6时,它将同时插入s和max堆栈中。1仅插入s。当移除时,1仅从s中移除(在max堆栈中仍保留6),因此打印max将给出6。我的输入不是您的工作案例A6 A1 R Q
,而是打印为空的A1 R Q
(如果(detail>max.top())
可能应该是如果(detail>=max.top())
)。嗯,您似乎没有检查任何值,因此我假设“R”将删除最近添加的项?因此A6 A1 R Q的堆栈将为6->6,6->6?除非我误解了“R”查询的概念。您能提供无效的输入吗?抱歉,我误解了您的解决方案。问题仍然存在。我正在思考优化我的读/写操作会有帮助。但是你所指的“问题”是什么?解决了。因为我使用的是cin/cout,所以我得到了更多的运行时间。使用scanf/printf解决了问题。不过,你的解决方案在算法空间/时间方面是可能的优化版本。谢谢!std::ios::sync_with_stdio(false);可能会有帮助。嗯,您似乎没有检查任何值,所以我假设“R”只会删除最近添加的项?因此A6 A1 R Q的堆栈将为6->6,6->6?除非我误解了“R”查询的概念。您能提供无效的输入吗?抱歉,我误解了您的解决方案。问题仍然存在。我认为优化我的读/写操作会有所帮助。但是你所指的“问题”是什么?解决了。因为我使用了cin/cout,所以我得到了更多的运行时间。使用scanf/printf解决了它。不过,你的解决方案在算法空间/时间方面是可能的优化版本。谢谢!std::ios::sync_with_stdio(false)可能会有帮助。
std::stack<int> stack;
for (int i = 0; i<q; i++)
{
std::cin >> query;
if (query == 'A')
{
std::cin >> detail;
int max = stack.empty() ? detail : std::max(detail, stack.top());
stack.push(max);
}
else if (query == 'R')
{
if (!stack.empty())
{
stack.pop();
}
}
else
{
if (stack.empty())
std::cout << "Empty\n";
else
std::cout << stack.top() << "\n";
}
}