【问题标题】:Why queue using two stacks not functioning?为什么使用两个堆栈进行队列不起作用?
【发布时间】:2019-04-07 07:00:11
【问题描述】:

我正在尝试使用 2 个堆栈实现一个队列,但我的代码无法正常运行。

你能发现错误吗?

#include <stdio.h>
#include<stdlib.h>
#define MAX 5

typedef struct stack {
  int top;
  int arr[MAX];
} stack;

void enque(stack*s1, int ele) {
  printf("entering");
  push(&s1, ele);
  printf("what a pain");
}

void push(stack*s, int ele) {
  if (s->top == MAX - 1) {
    printf("OVERFLOW");
  } else {
    s->arr[++s->top] = ele;
  }
}

int deq(stack*s1, stack*s2) {
  int x;
  if (s1->top == -1 && s2->top == -1) {
    printf("empty");
  } else {
    if (s2->top == -1) {
      while (s1->top != -1) {
        push(&s2, pop(&s1));
      }
    }
    x = pop(&s2);
    return x;
  }
}

int pop(stack *s) {
  if (s->top == -1) {
    printf("UNDERFLOW");
  } else {
    return s->arr[s->top--];
  }
}

void display(stack*s) {
  printf("entered display");
  int i;
  for (i = 0; i <= s->top; i++) {
    printf(" %d", s->arr[i]);
  }
}

int main() {
  int ch, ele, c;
  stack s1, s2;
  s1.top = -1, s2.top = -1;
  do {
    printf("1 - Enqueue2-deq3-display4-exit\n");
    printf("Enter choice");
    scanf("%d", &ch);
    switch (ch) {
      case 1:
        printf("enter ele of ur choice");
        scanf("%d", &ele);
        enque(&s1, ele);
        break;
      case 2:
        c = deq(&s1, &s2);
        printf("%d", c);
        break;
      case 3:
        display(&s1);
        break;
      case 4:
        exit(0);
      default:
        printf("Wrong choice");
    }
  } while (ch != 5);
}

【问题讨论】:

  • 请正确格式化您的代码,列出错误和您尝试过的事情。就其立场而言,这个问题是无法理解的。
  • 我是新手,我不知道如何提交我的代码?你能告诉我怎么做吗
  • 我删除了您在每行开头的ender code here。然后我突出显示您的代码并按下文本框上方的 {} 按钮以指示我选择的是代码而不是文本。请阅读有关如何发布问题的文档。我们不是来为您工作的。
  • 您的问题仍然无法回答。
  • 对不起,thnx ..当我按下 case 1 时,我基本上遇到了分段错误,这基本上是 enque 它假设将元素推送到堆栈 1 但我的 s1 顶部没有增加它进入 enque 然后它假设将元素添加到 s1 因为 push 函数被调用但显示分段错误。

标签: c stack queue


【解决方案1】:

你能发现错误吗?

编译器可以比 Stack-overflow 更快地发现错误。

OP 未在启用所有警告的情况下进行编译,或者正在使用弱编译器

启用所有警告以节省时间。


int deq(stack*s1, stack*s2)int pop(stack *s) 都有同样的问题。

在这种情况下,常见的衰减是warning: control reaches end of non-void function [-Wreturn-type]

确保每个函数路径都返回一个值。

int pop(stack *s) {
  if (s->top == -1) {
    printf("UNDERFLOW");  // Notice, no return
  } else {
    return s->arr[s->top--];
  }
}

在声明前也使用push(&amp;s1, ele);。这会导致函数签名发生冲突。使用前声明或定义push()。可能未定义的行为(UB),这使得代码不可靠。


我建议更频繁地打印'\n'

// printf("entering");
printf("entering\n");
// or
puts("entering");  // \n automatically added.

【讨论】:

  • 我纠正了你所说的所有错误,但它仍然没有将元素添加到堆栈中
  • @user10598529 附加到帖子 3 件事:输入的数据、看到的结果和预期的结果。
  • @user10598529 “我纠正了所有错误”很遗憾没有包括第一个修复:启用所有警告。否则你肯定会被警告push(&amp;s1, ele);
  • 你能告诉我关于我的推送操作的错误,请详细说明一下
【解决方案2】:

您在 dequeenque 函数中传递指针地址。

push(&s2, pop(&s1)); --> push(s2, pop(s1)); x = pop(&s2); --> x = pop(s2); push(&s1, ele);-->push(s1, ele);

因为s1s2 被接收为指向dequeenque 函数的指针


还要考虑 @Mr.Chux 建议的更改,考虑编译器警告,您可以自己解决所有问题。

【讨论】:

  • 嗨,你能不能详细说明第一点你说的更多解释为什么我的代码是错误的,因为按照你在第一点所说的,我的代码可以工作......我有点困惑它涉及在数据结构中使用指针...
  • 你写的第二点是,当我使 enque 成本更高时,如果我的 dequeu 操作成本更高,那么我们将它从堆栈 2 推回堆栈另一个堆栈,那么这是正确的方法,它更少耗时
  • @user10598529 回答您的第一个问题。您从主要的c = deq(&amp;s1, &amp;s2); 传递s1 and s2 的地址,即您将它们作为指针传递。因此,双端队列中的int deq(stack*s1, stack*s2) s1 and s2 是指针变量。当您这样做push(&amp;s2, pop(&amp;s1)); 时,您正在传递s1 and s2 的地址,即指向指针的指针。
  • @user10598529 回答您的第二个问题。你是对的。我完全误读了你的代码。你的方法很有效。
猜你喜欢
  • 2011-11-29
  • 1970-01-01
  • 2010-10-15
  • 2011-01-04
  • 2015-11-18
  • 2014-04-21
  • 2012-10-22
  • 2012-02-02
  • 1970-01-01
相关资源
最近更新 更多