美文网首页
0225-用队列实现栈

0225-用队列实现栈

作者: liyoucheng2014 | 来源:发表于2019-01-17 21:29 被阅读0次

用队列实现栈

方案一


这种方法的原理就是每次把新加入的数插到前头,这样队列保存的顺序和栈的顺序是相反的,它们的取出方式也是反的,那么反反得正,就是我们需要的顺序了。我们需要一个辅助队列tmp,把s的元素也逆着顺序存入tmp中,此时加入新元素x,再把tmp中的元素存回来,这样就是我们要的顺序了,其他三个操作也就直接调用队列的操作即可

C-源代码


typedef int LinkQueueData;

//节点
typedef struct link_queue_node {
    LinkQueueData data;
    struct link_queue_node *next;
}LinkQueueNode;

typedef struct link_queue {
    LinkQueueNode *head;//队头
    LinkQueueNode *tail;//队尾
    int count;//队大小
}LinkQueue;


LinkQueue *linkQueueCreate() {
    LinkQueue *queue = NULL;
    
    queue = (LinkQueue *)malloc(sizeof(LinkQueue));
    if (queue == NULL) {
        return NULL;
    }
    
    queue->head = NULL;
    queue->tail = NULL;
    queue->count = 0;
    
    return queue;
}

bool linkQueueIsEmpty(LinkQueue *queue) {
    return queue->count == 0;
}

int linkQueueEnqueue(LinkQueue *queue, LinkQueueData data) {
    if (queue == NULL) {
        return -1;
    }
    
    LinkQueueNode *p = NULL;
    
    p = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
    if (p == NULL) {
        return -1;
    }
    
    p->data = data;
    p->next = NULL;
    if (queue->head == NULL) {
        queue->head = p;
    }
    else {
        queue->tail->next = p;
    }
    queue->tail = p;
    queue->count++;
    
    return 0;
}

int linkQueueDequeue(LinkQueue *queue, LinkQueueData *data) {
    if (queue == NULL || linkQueueIsEmpty(queue)) {
        return -1;
    }
    
    *data = queue->head->data;
    
    LinkQueueNode *p = queue->head;
    p = queue->head;
    queue->head = queue->head->next;
    queue->count--;
    
    if (queue->head == NULL) {
        queue->tail = NULL;
    }
    
    free(p);
    
    return 0;
}

void linkQueueDestory(LinkQueue *queue) {
    
    if (queue != NULL && !linkQueueIsEmpty(queue)) {
        
        LinkQueueData data;
        while (!linkQueueIsEmpty(queue)) {
            int ret = linkQueueDequeue(queue, &data);
            if (ret != 0) {
                printf("delete failure\n");
            }
        }
        
        free(queue);
    }
    
}


typedef struct {
    
    LinkQueue *q;
} MyStack;

/** Initialize your data structure here. */
MyStack* myStackCreate(int maxSize) {
    
    MyStack *stack = (MyStack *)malloc(sizeof(MyStack));
    stack->q = linkQueueCreate();
    
    return stack;
}

/** Push element x onto stack. */
void myStackPush(MyStack* obj, int x) {
    
    LinkQueue *queue = linkQueueCreate();
    
    while(!linkQueueIsEmpty(obj->q)) {
        
        linkQueueEnqueue(queue, obj->q->head->data);
        
        int data = 0;
        linkQueueDequeue(obj->q, &data);
    }
    
    linkQueueEnqueue(obj->q, x);
    
    while(!linkQueueIsEmpty(queue)) {
        
        linkQueueEnqueue(obj->q, queue->head->data);
        
        int data = 0;
        linkQueueDequeue(queue, &data);
    }
    
    free(queue);
}

/** Removes the element on top of the stack and returns that element. */
int myStackPop(MyStack* obj) {
    
    int data;
    linkQueueDequeue(obj->q, &data);
    
    return data;
}

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

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

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

void test_0225(void) {
    MyStack *stack = myStackCreate(5);
    myStackPush(stack, 1);
    myStackPush(stack, 2);
    myStackPush(stack, 3);
    myStackPush(stack, 4);
    
    while (!myStackEmpty(stack)) {
        int data = myStackPop(stack);
        printf("%d\n", data);
    }
}

参考Grandyang

相关文章

  • 0225-用队列实现栈

    用队列实现栈 方案一 这种方法的原理就是每次把新加入的数插到前头,这样队列保存的顺序和栈的顺序是相反的,它们的取出...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • leecode刷题(26)-- 用栈实现队列

    leecode刷题(26)-- 用栈实现队列 用栈实现队列 使用栈实现队列的下列操作: push(x) -- 将一...

  • C语言第七次作业:链表

    707. 设计链表 空指针 空节点 225. 用队列实现栈 链式存储栈 双队列实现栈 232. 用栈实现队列 链式...

  • 队列之-队列实现栈

    一、队列实现栈核心算法概述 之前已经描述过了用栈实现队列的功能,见栈系列之-实现队列,那么同样队列也可以用来实现栈...

  • 38_两个有趣的问题

    关键词:通过栈实现队列、通过队列实现栈 0. 通过栈实现队列 用栈实现队列等价于用后进先出的特性实现先进先出的特性...

  • 栈&队列

    一、栈&队列总结 栈/队列的应用接雨水验证栈序列滑动窗口的最大值 栈/队列的特殊实现用两个栈实现队列用两个队列实现...

  • 面试题9: 用两个栈实现队列

    9-1 用两个栈实现队列 9-2 用两个队列实现栈

  • LeetCode 每日一题 [12] 用队列实现栈

    LeetCode 用队列实现栈 [简单] 使用队列实现栈的下列操作: push(x) -- 元素 x 入栈pop(...

  • Python学习教程:用队列实现栈

    接着上一期跟大家说的用栈实现队列,这期的Python学习教程跟大家讲用队列实现栈 题目:使用队列实现栈的下列操作:...

网友评论

      本文标题:0225-用队列实现栈

      本文链接:https://www.haomeiwen.com/subject/nbuwdqtx.html