Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在堆栈的中间找到元素 我在一次采访中被问到这个问题。问题是我将得到一个堆栈,并且必须在堆栈的中间位置找到元素。“Top”索引不可用(这样你就不会弹出(顶部)/ 2次并返回答案)。返回-1。不使用任何其他数据结构_C_Algorithm_Data Structures_Recursion - Fatal编程技术网

C 在堆栈的中间找到元素 我在一次采访中被问到这个问题。问题是我将得到一个堆栈,并且必须在堆栈的中间位置找到元素。“Top”索引不可用(这样你就不会弹出(顶部)/ 2次并返回答案)。返回-1。不使用任何其他数据结构

C 在堆栈的中间找到元素 我在一次采访中被问到这个问题。问题是我将得到一个堆栈,并且必须在堆栈的中间位置找到元素。“Top”索引不可用(这样你就不会弹出(顶部)/ 2次并返回答案)。返回-1。不使用任何其他数据结构,c,algorithm,data-structures,recursion,C,Algorithm,Data Structures,Recursion,例如: 回答:1(我不是指中位数,而是指中间位置的元素) 递归是唯一的方法吗 谢谢 psy这里有一个解决方案:拿两个指针,一次前进两步(快),另一个一次只前进一步(慢)。如果快的到达底部,返回指向中间索引的慢指针。不需要递归 int * slow = stack; int * fast = stack; while(1) { if(STACK_BOTTOM(fast)) return slow; fast--; if(STACK_BOTTOM(fast)) return

例如:


回答:1(我不是指中位数,而是指中间位置的元素)

递归是唯一的方法吗

谢谢


psy这里有一个解决方案:拿两个指针,一次前进两步(快),另一个一次只前进一步(慢)。如果快的到达底部,返回指向中间索引的慢指针。不需要递归

int * slow = stack;
int * fast = stack;
while(1) {
    if(STACK_BOTTOM(fast)) return slow;
    fast--;
    if(STACK_BOTTOM(fast)) return slow;
    slow--;
    fast--;
}

递归从来不是唯一的方法;)


但是,递归为您提供了一个隐含的附加堆栈(即函数参数和局部变量),而且您确实需要一些附加存储来存储遍历的元素,在这种情况下,递归可能是给定该约束的唯一方法。

遍历堆栈,计算深度,并在返回的路上返回相应的元素

int middle(stack* s, int n, int* depth) {
  if (stack_empty(s)) {
    *depth = n;
    return 0; //return something, doesn't matter..
  }
  int val = stack_pop(s);
  int res = middle(s, n+1, depth);
  stack_push(s, val);
  if (n == *depth/2)
    return val;
  return res;
}

int depth;
middle(&stack, 0, &depth);

注意:是的,递归是唯一的方法。不知道堆栈的深度意味着您必须将这些值存储在某个地方。

递归似乎是唯一的方法。如果在弹出过程中尝试使用快指针和慢指针概念,则需要将值存储在某个地方,这违反了无附加数据结构的要求。

此问题用
c
标记,因此对于c编程语言,我同意递归是唯一的方法。但是,如果支持第一类匿名函数,则无需递归即可解决它。一些伪代码(使用Haskell的lambda语法):

请注意:在while循环期间,没有对
f
的(递归)调用f(a)只是用来构造一个新的(!)函数,它又被称为
f

假设堆栈有3个元素10、20、30(从下到上),这基本上构成了lambda

(\a -> if a==1
       then 30
       else (\b -> if b==2
                   then 20
                   else (\c -> if c==3
                                  then 10
                                  else (\d -> 0)(c)
                        )
                        (b)
            )
            (a)
)
或者更具可读性一点

f(x) = if x==1 then 30 else (if x==2 then 20 else (if x==3 then 10 else 0)) 
“…不要使用任何其他数据结构…”


那么这个任务就无法解决了,因为您需要一个存储弹出数据的地方。递归需要另一个堆栈,它也是一个数据结构。禁止任何数据结构并允许递归是没有意义的。

“在中间位置查找元素”--这是中位数的定义:)您可以使用什么?没有额外的VAR?有哪些堆栈方法可用,推送、弹出等?有4个元素的堆栈的“中间”元素是什么?[ 4 13 22 31 ]? 13还是22@jancha不,中值是具有中间值的元素。@kannan你所说的
“递归是唯一的方法吗?”
你是在暗示你已经知道一个解决方案吗?递归不等于使用另一个堆栈吗?问题是不允许使用其他数据结构。这是否意味着“不要使用其他类型的数据结构(堆栈除外)”或“不要使用任何可以容纳超过O(1)个元素的其他结构,包括另一个堆栈”?您知道堆栈是正确的吗?这假设堆栈是以某种方式实现的,并且您可以访问其内部。堆栈是否定义了随机访问操作?如果没有,您将不得不将弹出的所有内容都转移到第二个堆栈中,但问题特别指出不要使用额外的数据结构。没错,但这只是给出一个想法。如果它是用LinkedList实现的,则必须调整代码,但原则仍然有效。facepalm需要说明的是,您不知道堆栈是如何实现的。@rumpel,您能将代码重写为仅使用“pop()和“push()”运算符吗?您假设在使用“快速”指针看到“慢速”指针后,数据仍然存在,以供访问,但我认为pop/push操作不可能做到这一点。+1 Iff OP阐明了递归是允许的。(不,对于那些不知道的人来说,这不是一个拼写错误)如果没有额外的数据结构,你必须使用递归来存储这些值。允许递归。我支持你的观点。你必须使用递归来存储这些值。我想可能还有别的解决办法。
(\a -> if a==1
       then 30
       else (\b -> if b==2
                   then 20
                   else (\c -> if c==3
                                  then 10
                                  else (\d -> 0)(c)
                        )
                        (b)
            )
            (a)
)
f(x) = if x==1 then 30 else (if x==2 then 20 else (if x==3 then 10 else 0))