使用C中的两个堆栈实现队列

时间:2017-07-16 10:30:08

标签: c data-structures stack queue

为什么我的代码在运行时会被粉碎。它表示传递不兼容的指针类型传递Push()函数。如何解决这个问题?

这是我在C中实现的代码。这是一个快速的总结我是如何尝试解决问题的。

  • 首先我为Stack
  • 创建了一个结构
  • 为堆栈写了推送和弹出功能
  • 为Queue写了一个结构
  • EnQueue的第一个堆栈和DeQueue操作的第二个堆栈。

    Database

1 个答案:

答案 0 :(得分:2)

三个问题:

a)调用Push - 错误的参数类型:struct Stack **top预期不是struct Stack *top

b)调用Pop - 错误的参数类型:struct Stack **top期望不是struct Stack *top

c)队列* CreateQueue - 未分配内存

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

struct Stack {
    int data;
    struct Stack *next;
};


struct Stack *CreateStack () {
    return NULL;
}

int isEmptyStack(struct Stack *top) {
    return (top == NULL);
}

void Push(struct Stack **top, int data) {
    struct Stack *newNode = (struct Stack*) malloc(sizeof(struct Stack));
    if(!newNode)
        return;
    newNode->data = data;
    newNode->next = *top;
    *top = newNode;
}

int Pop(struct Stack **top) {
    struct Stack *temp;
    int data;

    if(isEmptyStack(*top)) {
        printf("Empty Stack.\n");
        return INT_MIN;
    }

    temp = *top;
    data = (*top)->data;
    *top = (*top)->next;
    free(temp);
    return data;
}

struct Queue {
    struct Stack *S1;
    struct Stack *S2;
};

struct Queue *CreateQueue() {

    struct  Queue  *newNode = (struct Queue *) malloc(sizeof(struct  Queue ));

    return newNode;
}

void EnQueue(struct Queue *Q, int data) {
    Push(&Q->S1, data);
}

int DeQueue(struct Queue *Q) {
    if(!isEmptyStack(Q->S2)) {
        return Pop(&Q->S2);
    }
    else {
        while(!isEmptyStack(Q->S1)) {
            Push(&Q->S2, Pop(&Q->S1));
        }
        return Pop(&Q->S2);
    }
}

int main() {
    struct Queue *Q = CreateQueue();
    Q->S1 = Q->S2 = NULL;
    EnQueue(Q, 1);
    EnQueue(Q, 2);
    EnQueue(Q, 3);

    printf("%d ", DeQueue(Q));
    printf("%d ", DeQueue(Q));
    printf("%d ", DeQueue(Q));

    return 0;
}

输出:

1 2 3