C 为什么使用两个堆栈的队列不起作用?

C 为什么使用两个堆栈的队列不起作用?,c,stack,queue,C,Stack,Queue,我正在尝试使用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

我正在尝试使用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);
}
#包括
#包括
#定义最大值5
typedef结构堆栈{
int top;
int-arr[MAX];
}堆叠;
无效元素(堆栈*s1,内部元素){
printf(“输入”);
推送(s1和s1,ele);
printf(“多么痛苦”);
}
无效推送(堆栈*s,内部元素){
如果(s->top==最大值-1){
printf(“溢出”);
}否则{
s->arr[++s->top]=ele;
}
}
int deq(堆栈*s1,堆栈*s2){
int x;
如果(s1->top==-1&&s2->top==-1){
printf(“空”);
}否则{
如果(s2->top==-1){
而(s1->top!=-1){
推送(&s2、弹出(&s1));
}
}
x=pop(&s2);
返回x;
}
}
int-pop(堆栈*s){
如果(s->top==-1){
printf(“下溢”);
}否则{
返回s->arr[s->top--];
}
}
无效显示(堆栈*s){
printf(“输入显示”);
int i;
对于(i=0;i top;i++){
printf(“%d”,s->arr[i]);
}
}
int main(){
int ch、ele、c;
堆栈s1、s2;
s1.top=-1,s2.top=-1;
做{
printf(“1-Enqueue2-deq3-display4-exit\n”);
printf(“输入选择”);
scanf(“%d”和“ch”);
开关(ch){
案例1:
printf(“输入您选择的元素”);
scanf(“%d”、&ele);
enque(&s1,ele);
打破
案例2:
c=deq(&s1和&s2);
printf(“%d”,c);
打破
案例3:
显示(&s1);
打破
案例4:
出口(0);
违约:
printf(“错误选择”);
}
}而(ch!=5);
}
你能发现错误吗

#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);
}
编译器可以比堆栈溢出更快地发现错误

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

启用所有警告以节省时间


intdeq(stack*s1,stack*s2)
intpop(stack*s)
都有相同的问题

在这种情况下,一个常见的衰减是
警告:控件到达非无效函数的末尾[-Wreturn type]

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

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

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


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

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

您正在
deque
enque
函数中传递指针地址

push(&s2,pop(&s1));-->推(s2,弹出(s1));
x=pop(&s2);-->x=pop(s2);
推送(&s1,ele);-->推(s1,ele)

因为
s1
s2
被接收为指向
deque
enque
函数的指针



还考虑了@的更改,考虑编译器警告,您可以自己解决所有问题。< /P>请正确地格式化代码,列出错误和所尝试的东西。这个问题是不可理解的。我是新来的,我不知道如何提交我的代码?你能告诉我怎么做吗?我删除了每行开头的

ender代码。然后我突出显示了您的代码并按下了文本框上方的{}按钮,以表明我选择的是代码而不是文本。请阅读关于如何发布问题的文档。我们不是来为你工作的。你的问题仍然无法回答。对不起,thnx..基本上,当我按下案例1时,我得到了一个分段错误,基本上是enque,它假设将一个元素推到堆栈1上,但我的s1顶部没有增加。它进入enque,然后由于推送,它假设将元素添加到s1上函数被调用,但它显示了分段错误。我纠正了u所说的所有错误,但它仍然没有将元素添加到stack@user10598529在帖子后面附加三件事:输入的数据、看到的结果和预期的结果。@user10598529“我纠正了所有错误”,不幸的是没有包括第一个修复:启用所有警告。否则您肯定会被警告使用
push(&s1,ele)。你能告诉我推送操作的错误吗?请详细说明我能详细说明第一点吗?你说了更多解释为什么我的代码是错误的,因为按照你在第一点中所说的做,我的代码就可以工作了。谈到在数据结构中使用指针,我有点困惑……还有第二点u写道,当我使enque更昂贵时,我们将其从堆栈2推回到另一个堆栈。如果我的DEQUE操作更昂贵,那么这是正确的方法,时间更短consuming@user10598529回答你的第一个问题。您从main
c=deq(&s1,&s2)传递
s1和s2的地址也就是说,您正在将它们作为指针传递。因此,deque中的
intdeq(stack*s1,stack*s2)
s1和s2
是指针变量。执行此操作时,
push(&s2,pop(&s1))
您正在传递
s1和s2的地址,这是指向指针的指针。@user10598529回答您的第二个问题。没错。我完全误读了你的密码。你的方法很有效。