用队列实现栈

typedef int DataType;

typedef struct QNode {
    DataType data;
    struct QNode* next;
}QNode;

typedef struct Queue {
    QNode* front;
    QNode* rear;
    int size;
}Queue;


//初始化
void QueueInit(Queue* q) {
    q->front = q->rear = NULL;
    q->size = 0;
}


//创建结点
QNode* QNodeCreat(DataType data) {
    QNode* node = (QNode*)malloc(sizeof(QNode));
    node->data = data;
    node->next = NULL;
    return node;
}


//进队(尾插)
void QueuePush(Queue* q, DataType data) {
    QNode* node = QNodeCreat(data);
    //看看是不是空队列
    if (q->front == NULL) {
        q->front = q->rear = node;
    }
    else {
        q->rear->next = node;
        q->rear = node;
    }
    q->size++;
}


//出队(头删)
void QueuePop(Queue* q) {
    if (q->front == NULL) {
        //队列为空, 出队失败
        return;
    }

    QNode* next = q->front->next;
    free(q->front);
    q->front = next;

    //删除后是否为空表
    if (q->front == NULL) {
        q->rear = NULL;
    }
    q->size--;
}


//得到队首元素
DataType getQueueFront(Queue* q) {
    return q->front->data;
}


//得到队尾元素
DataType getQueueBack(Queue* q) {
    return q->rear->data;
}


//得到队列长度
int getQueueSize(Queue* q) {
    return q->size;
}


//判空
int QueueEmpty(Queue* q) {
    if (q->front == NULL) {
        return 1;
    }
    return 0;
}


//销毁
void QueueDertory(Queue* q) {
    QNode* cur = q->front;
    while (cur != NULL) {
        QNode* tmp = cur->next;
        free(cur);
        cur = tmp;
    }
    q->front = q->rear = NULL;
    q->size = 0;
}



typedef struct {
    //用一个队列实现栈
    Queue q;
} MyStack;

/** Initialize your data structure here. */

MyStack* myStackCreate() {
    MyStack* ms = (MyStack*)malloc (sizeof(MyStack));
    QueueInit(&ms->q);
    return ms;
}

/** Push element x onto stack. */
void myStackPush(MyStack* obj, int x) {
    //就是入队操作
    QueuePush(&obj->q, x);
}

/** Removes the element on top of the stack and returns that element. */
int myStackPop(MyStack* obj) {
    //出栈是从栈顶(数组的尾)删除一个元素
    //而出队是从队列的队头(数组的头)删除一个元素
    //用队列实现栈  
    //就要让队列中除了队尾的值先出队在入队, 最后的一个元素就是要得到的元素
    int size = getQueueSize(&obj->q);
    while (size > 1) {
        int front = getQueueFront(&obj->q);
        QueuePop(&obj->q);
        QueuePush(&obj->q, front);
        size--;
    }
    int ret = getQueueFront(&obj->q);
    QueuePop(&obj->q);
    return ret;
}

/** Get the top element. */
int myStackTop(MyStack* obj) {
    return getQueueBack(&obj->q);
}

/** Returns whether the stack is empty. */
bool myStackEmpty(MyStack* obj) {
    return QueueEmpty(&obj->q);
}

void myStackFree(MyStack* obj) {
    QueueDertory(&obj->q);
    free(obj);
}

/**
 * Your MyStack struct will be instantiated and called as such:
 * MyStack* obj = myStackCreate();
 * myStackPush(obj, x);
 
 * int param_2 = myStackPop(obj);
 
 * int param_3 = myStackTop(obj);
 
 * bool param_4 = myStackEmpty(obj);
 
 * myStackFree(obj);
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殇&璃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值