您当前的位置: 首页 > 

风间琉璃•

暂无认证

  • 3浏览

    0关注

    337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

用队列实现栈

风间琉璃• 发布时间:2021-10-18 23:09:40 ,浏览量:3

项目场景:

提示:这里简述项目相关背景:

队列练习题

原因分析:

提示:这里填写问题的分析:

栈是一种后进先出的数据结构,元素从顶端入栈,然后从顶端出栈。 队列是一种先进先出的数据结构,元素从后端入队,然后从前端出队。

1.两个队列 为了满足栈的特性,即最后入栈的元素最先出栈,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素。可以使用两个队列实现栈的操作,其中queue1用于存储栈内的元素,queue 2作为入栈操作的辅助队列,即存储临时入栈的元素

一个队列为主队列,一个为辅助队列,当入栈操作时,先将主队列内容导入辅助队列,然后将入栈元素放入主队列队头位置,再将辅助队列内容,依次添加进主队列即可

入栈操作时,首先将元素入队到queue2,然后将queue1的全部元素依次出队并入队到 queue2,此时queue2的前端的元素即为新入栈的元素,再将 queue1和 queue2互换,则queue1的元素即为栈内的元素,queue1的前端和后端分别对应栈顶和栈底

由于每次入栈操作都确保queue1的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除queue1的前端元素并返回即可,获得栈顶元素操作只需要获得queue1的前端元素并返回即可(不移除元素)。

由于 queue1用于存储栈内的元素,判断栈是否为空时,只需要判断 queue1 ​是否为空即可。

2.一个队列

当某一元素入栈队时,将之前的出队,再重新入队即可 入栈操作时,首先获得入栈前的元素个数 n,然后将元素入队到队列,再将队列中的前 n个元素(即除了新入栈的元素之外的全部元素)依次出队并入队到队列,此时队列的前端的元素即为新入栈的元素,且队列的前端和后端分别对应栈顶和栈底。

由于每次入栈操作都确保队列的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除队列的前端元素并返回即可,获得栈顶元素操作只需要获得队列的前端元素并返回即可(不移除元素)。队列用于存储栈内的元素,判断栈是否为空时,只需要判断队列是否为空即可。

解决方案:

提示:这里填写该问题的具体解决方案:

#define SIZE 20
typedef struct queue
{
    int *data;
    int front;
    int rear;
    int size;
} Queue;

typedef struct
{
    Queue *queue1,*queue2;
}MyStack;

Queue *initQueue(int size)
{
    Queue* obj=(Queue*)malloc(sizeof(Queue));//申请队列
    obj->data=(int*)malloc(size*sizeof(int));//队列存储空间大小申请
    obj->front=-1;
    obj->rear=-1;
    obj->size=size;
    return obj;
}

void enQueue(Queue *obj,int e)
{
    if(obj->front==-1)
    {
        obj->front=0;
    }
    obj->rear=(obj->rear + 1)%obj->size; //rear指针向后移
    obj->data[obj->rear]=e;
}

int deQueue(Queue *obj)
{
   int temp=obj->data[obj->front];
   if(obj->front==obj->rear)
   {
       obj->rear=-1;
       obj->front=-1;
       return temp;
   }
   obj->front=(obj->front +1)%obj->size;
   return temp;
}

int isEmpty(Queue *obj)
{
    return obj->front==-1;
}

MyStack* myStackCreate() 
{
    MyStack *obj = (MyStack *)malloc(sizeof(MyStack));
    obj->queue1 = initQueue(SIZE);
    obj->queue2 = initQueue(SIZE);
    return obj;
}

void myStackPush(MyStack* obj, int x) 
{
    if(isEmpty(obj->queue1))  // 空队列
    {
        enQueue(obj->queue2, x);  //先加到2,
    } 
    else 
    {
        enQueue(obj->queue1, x);  // 加到1
    }
}

int myStackPop(MyStack* obj) 
{
    if(isEmpty(obj->queue1)) // 队列1空
    {
        while(obj->queue2->front != obj->queue2->rear)  // 队列2不为空
        {
            enQueue(obj->queue1, deQueue(obj->queue2));
        }
        return deQueue(obj->queue2);
    }
    while(obj->queue1->front != obj->queue1->rear) // 队列1不为空
    {
        enQueue(obj->queue2, deQueue(obj->queue1));
    }
    return deQueue(obj->queue1);
}

int myStackTop(MyStack* obj) 
{
    if(isEmpty(obj->queue1)) 
    {
        return obj->queue2->data[obj->queue2->rear];
    }
    return obj->queue1->data[obj->queue1->rear];
}

bool myStackEmpty(MyStack* obj) 
{
    if(obj->queue1->front == -1 && obj->queue2->front == -1) 
    {
        return true;
    }
    return false;
}

void myStackFree(MyStack* obj) 
{
    free(obj->queue1->data);
    obj->queue1->data = NULL;
    free(obj->queue1);
    obj->queue1 = NULL;
    free(obj->queue2->data);
    obj->queue2->data = NULL;
    free(obj->queue2);
    obj->queue2 = NULL;
    free(obj);
    obj = NULL;
}

/**
 * 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);
*/
typedef struct tagListNode 
{
    struct tagListNode* next;
    int val;
} ListNode;

typedef struct 
{
    ListNode* top;
} MyStack;

MyStack* myStackCreate() 
{
    MyStack* stk = calloc(1, sizeof(MyStack));
    return stk;
}

void myStackPush(MyStack* obj, int x) 
{
    ListNode* node = malloc(sizeof(ListNode));
    node->val = x;
    node->next = obj->top;
    obj->top = node;
}

int myStackPop(MyStack* obj) 
{
    ListNode* node = obj->top;
    int val = node->val;
    obj->top = node->next;
    free(node);

    return val;
}

int myStackTop(MyStack* obj) 
{
    return obj->top->val;
}

bool myStackEmpty(MyStack* obj) 
{
    return (obj->top == NULL);
}

void myStackFree(MyStack* obj) 
{
    while (obj->top != NULL) 
    {
        ListNode* node = obj->top;
        obj->top = obj->top->next;
        free(node);
    }
    free(obj);
}

关注
打赏
1665385461
查看更多评论
立即登录/注册

微信扫码登录

0.0836s