标签: stack

设计一个堆栈,使得getMinimum()应为O(1)

这是一个面试问题.您需要设计一个包含整数值的堆栈,以便getMinimum()函数返回堆栈中的最小元素.

例如:考虑下面的例子

case #1

5  --> TOP
1
4
6
2

When getMinimum() is called it should return 1, which is the minimum element 
in the stack. 

case #2

stack.pop()
stack.pop()

Note: Both 5 and 1 are poped out of the stack. So after this, the stack
looks like,

4  --> TOP
6
2

When getMinimum() is called is should return 2 which is the minimum in the 
stack.

制约性:

  1. getMinimum应返回O(1)中的最小值
  2. 在设计时也必须考虑空间约束,如果使用额外的空间,它应该是恒定的空间.

language-agnostic algorithm stack data-structures

116
推荐指数
5
解决办法
10万
查看次数

如何增加Java堆栈大小?

我问这个问题是为了了解如何在JVM中增加运行时调用堆栈的大小.我已经得到了答案,我还得到了许多有用的答案和评论,这些答案和评论与Java如何处理需要大型运行时堆栈的情况有关.我已经用答案摘要扩展了我的问题.

最初我想增加JVM堆栈大小,所以程序就像没有运行的程序一样StackOverflowError.

public class TT {
  public static long fact(int n) {
    return n < 2 ? 1 : n * fact(n - 1);
  }
  public static void main(String[] args) {
    System.out.println(fact(1 << 15));
  }
}
Run Code Online (Sandbox Code Playgroud)

相应的配置设置是java -Xss...具有足够大值的命令行标志.对于TT上面的程序,它与OpenJDK的JVM一样:

$ javac TT.java
$ java -Xss4m TT
Run Code Online (Sandbox Code Playgroud)

其中一个答案还指出,这些-X...标志是依赖于实现的.我在用

java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.1) (6b18-1.8.1-0ubuntu1~8.04.3)
OpenJDK 64-Bit Server VM (build 16.0-b13, mixed mode)
Run Code Online (Sandbox Code Playgroud)

也可以仅为一个线程指定一个大堆栈(参见其中一个答案如何).建议使用此方法java -Xss...以避免为不需要它的线程浪费内存.

我很好奇上面的程序需要多大的堆栈,所以我运行它n增加了:

  • -Xss4m就足够了 fact(1 …

java stack-overflow stack

114
推荐指数
4
解决办法
17万
查看次数

线程有不同的堆吗?

据我所知,当操作系统创建线程时,每个线程都会获得一个不同的堆栈.我想知道每个线程是否也有一个与自身不同的堆?

c linux windows stack multithreading

112
推荐指数
3
解决办法
6万
查看次数

如何从Delphi程序或编译器生成的调试信息中提取局部变量信息(地址和类型)?

我的目标是:

  • 给定Delphi编译的32位或64位Windows程序中的挂起线程,以便遍历堆栈(可行)
  • 给定堆栈条目,枚举每个方法中的局部变量及其值.也就是说,至少找到它们的地址和类型(integer32/64/signed/unsigned,string,float,record,class ...),其组合可用于查找它们的值.

第一个很好,这是这个问题的第二个问题.在高级别,如何在Delphi中给出堆栈条目枚举局部变量?


在较低的水平,这是我一直在调查:

RTTI:没有列出有关方法的这类信息.这不是我实际上认为是一个现实的选择,但无论如何列在这里.

调试信息:加载为调试版本生成的调试信息.

  • 映射文件:即使是详细的映射文件(文本格式文件!打开并查看)也不包含本地变量信息.它基本上是地址列表和源文件行号.非常适合文件和行相关的地址,例如装订线中的蓝点; 不是更好的更详细的信息
  • 远程调试信息(RSM文件) - 没有关于其内容或格式的已知信息.
  • TD32/TDS文件:我目前的研究方向.它们包含许多其他信息中的全局和局部符号.

我遇到的问题是:

  • 没有TD32文件格式的文档(我可以找到.)
  • 我对它们的大部分知识来自使用它们的Jedi JCL代码(JclTD32.pas),我不确定如何使用该代码,或者那里的结构是否足以显示本地变量.我很确定它会处理全局符号,但我对本地问题非常不确定.定义了各种各样的常量,没有格式的文档,读取它们的含义,我只是猜测.但是,这些常量和它们的名称必须来自某个地方.
  • 我可以找到使用TDS信息的源不加载或处理本地符号.

如果这是正确的方法,那么这个问题变成'是否有TDS/TD32文件格式的文档,是否有任何加载局部变量的代码示例?'

代码示例不是必需的,但可能非常有用,即使它非常小.

delphi stack local-variables debug-symbols

105
推荐指数
1
解决办法
1616
查看次数

将DIV堆叠在一起?

是否可以堆叠多个DIV,如:

<div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
Run Code Online (Sandbox Code Playgroud)

那么所有那些内部DIV都有相同的X和Y位置?默认情况下,它们都低于彼此,将Y位置增加上一个前一个DIV的高度.

我有一种浮动或显示或其他技巧可以咬人的感觉?

编辑:父DIV具有位置相对,因此,使用绝对位置似乎不起作用.

html css stack css-float

104
推荐指数
7
解决办法
32万
查看次数

在大多数现代系统中,堆栈增长的方向是什么?

我正在准备C中的一些培训材料,我希望我的示例适合典型的堆栈模型.

C堆栈在Linux,Windows,Mac OSX(PPC和x86),Solaris和最新的Unix中的发展方向是什么?

assembly stack callstack abi stack-frame

101
推荐指数
6
解决办法
4万
查看次数

C/C++程序的最大堆栈大小

我想在100 X 100阵列上进行DFS.(假设数组的元素代表图形节点)因此,假设最坏的情况,递归函数调用的深度可以达到10000,每个调用占用20个字节.那么可行的方法是否存在stackoverflow的可能性?

C/C++中堆栈的最大大小是多少?

请指定gcc for
1)cygwin on Windows
2)Unix

一般限制是什么?

c c++ stack

99
推荐指数
7
解决办法
13万
查看次数

为什么堆栈通常会向下增长?

我知道在我个人熟悉的架构(x86,6502等)中,堆栈通常会向下增长(即,每个推入堆栈的项目都会导致SP递减,而不是递增的SP).

我想知道这个的历史原因.我知道在一个统一的地址空间中,在数据段的另一端(例如)开始堆栈很方便,所以如果双方在中间发生碰撞,那么只会出现问题.但是为什么堆栈传统上是最重要的?特别是考虑到这与"概念"模型的对立面如何?

(请注意,在6502架构中,堆栈也向下增长,即使它被限制在一个256字节的页面上,这个方向选择似乎是任意的.)

architecture stack history

87
推荐指数
5
解决办法
2万
查看次数

为什么C#中的堆栈大小正好是1 MB?

今天的PC有大量的物理RAM,但是C#的堆栈大小对于32位进程只有1 MB而对于64位进程只有4 MB(C#中的堆栈容量).

为什么CLR中的堆栈大小仍然如此有限?

为什么它恰好是1 MB(4 MB)(而不是2 MB或512 KB)?为什么决定使用这些金额?

对该决定背后的考虑因素和原因感兴趣.

c# clr stack stack-size

87
推荐指数
2
解决办法
3万
查看次数

堆栈是向上还是向下增长?

我在c中有这段代码:

int q = 10;
int s = 5;
int a[3];

printf("Address of a: %d\n",    (int)a);
printf("Address of a[1]: %d\n", (int)&a[1]);
printf("Address of a[2]: %d\n", (int)&a[2]);
printf("Address of q: %d\n",    (int)&q);
printf("Address of s: %d\n",    (int)&s);
Run Code Online (Sandbox Code Playgroud)

输出是:

Address of a: 2293584
Address of a[1]: 2293588
Address of a[2]: 2293592
Address of q: 2293612
Address of s: 2293608
Run Code Online (Sandbox Code Playgroud)

所以,我看到,从那里a开始a[2],内存地址每个增加4个字节.但是,从qs,内存地址减少了4个字节.

我想知道两件事:

  1. 堆栈是成长还是下降?(在这种情况下看起来对我来说都是)
  2. a[2]q内存地址之间发生了什么?为什么那里存在很大的记忆差异?(20个字节).

注意:这不是作业问题.我很好奇堆栈是如何工作的.谢谢你的帮助.

c memory stack

82
推荐指数
4
解决办法
6万
查看次数