用栈实现队列

题目来自力扣,具体的要求如下:

目录

思路

 1、初始化队列

2、入队列

3、出队列

4、队列开头的元素

 5、判断空队列

6、队列销毁

附:栈的操作:


思路

首先需要开辟两个个栈,因为栈的性质是先入后出,所以需要一个栈专门入数据,另一个栈专门出数据,这样就实现了先入先出的队列。

 1、初始化队列

MyQueue* myQueueCreate() {
    MyQueue * que=(MyQueue *)malloc(sizeof(MyQueue));
    if(que==NULL)
    {
        printf("malloc is fail");
        exit(-1);
    }
    StackInit(&que->st1);
     StackInit(&que->st2);
     return que;
}

2、入队列

经过分析可知,只需要入第一个栈即可。


void myQueuePush(MyQueue* obj, int x) {  
         StackPush(&obj->st1, x);
}

3、出队列

因为要按照先入先出的原则出队列,所以第二个栈是专门用来出队列的,但是必须要确保第一个栈是空的,即要先把第一个栈的数据导入到第二个栈中。

int myQueuePop(MyQueue* obj) {
     if(StackEmpty(&obj->st2))
     {
         while(!StackEmpty(&obj->st1))  //如果st1不为空
          {
         StackPush(&obj->st2, StackTop(&obj->st1));
         StackPop(&obj->st1);
          }
     }
    int ret=StackTop(&obj->st2);
    StackPop(&obj->st2);
    return ret;
}

4、队列开头的元素

在此我们需要思考队列开头的元素在哪个位置,假设一个队列是1,2,3,4,5,那么这个队列的头元素是1,此时队列的的数据就存放在第一个数据栈中。由栈的特性可知,我们是不能返回数据栈中的第一个元素,所以只能参照出队列的思路,将数据栈的元素导入到出栈中,然后返回出栈的元素即可。

 

int myQueuePeek(MyQueue* obj) {
    if(StackEmpty(&obj->st2))    // 如果st2 为空 就把st1的数据倒过来
    {
            while(!StackEmpty(&obj->st1))  //如果st1不为空
         {
         StackPush(&obj->st2, StackTop(&obj->st1));
         StackPop(&obj->st1);
         }
    }
    int ret=StackTop(&obj->st2);
    return ret;
}

 5、判断空队列

要同时判断两个栈中是否为空。

bool myQueueEmpty(MyQueue* obj) {
      return StackEmpty(&obj->st1)&&StackEmpty(&obj->st2);
}

6、队列销毁

先销毁俩个栈,然后释放开辟出队列的指针。

void myQueueFree(MyQueue* obj) {
      StackDestroy(&obj->st1);
       StackDestroy(&obj->st2);
       free(obj);
}

附:栈的操作:

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;		// 栈顶
	int capacity;  // 容量 
}Stack;
// 初始化栈 
void StackInit(Stack* ps);
// 入栈 
void StackPush(Stack* ps, STDataType data);
// 出栈 
void StackPop(Stack* ps);
// 获取栈顶元素 
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数 
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
bool StackEmpty(Stack* ps);
// 销毁栈 
void StackDestroy(Stack* ps);

// 初始化栈 
void StackInit(Stack* ps)
{
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

// 入栈 
void StackPush(Stack* ps, STDataType data)
{
	//先扩容
	if (ps->capacity == ps->top)
	{
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		STDataType* temp = (STDataType*) realloc (ps->a, sizeof(STDataType) * newcapacity);
		if (temp == NULL)
		{
			printf("realloc is fail\n");
			exit(-1);
		}
		ps->a = temp;
		ps->capacity = newcapacity;
	}
		ps->a[ps->top] = data;
		ps->top++;
	
}
// 出栈 
void StackPop(Stack* ps)
{
	assert(!StackEmpty( ps));
	ps->top--;
	// 销毁栈 )
}
// 获取栈顶元素 
STDataType StackTop(Stack* ps)
{
	assert(!StackEmpty(ps));
	return ps->a[ps->top-1];
}
// 获取栈中有效元素个数 
int StackSize(Stack* ps)
{
	return ps->top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
bool StackEmpty(Stack* ps)
{
	return ps->top == 0;
}
// 销毁栈 
void StackDestroy(Stack* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}


typedef struct {
    Stack st1;
    Stack st2;
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue * que=(MyQueue *)malloc(sizeof(MyQueue));
    if(que==NULL)
    {
        printf("malloc is fail");
        exit(-1);
    }
    StackInit(&que->st1);
     StackInit(&que->st2);
     return que;
}

void myQueuePush(MyQueue* obj, int x) {  
         StackPush(&obj->st1, x);
}

int myQueuePop(MyQueue* obj) {
     if(StackEmpty(&obj->st2))
     {
         while(!StackEmpty(&obj->st1))  //如果st1不为空
          {
         StackPush(&obj->st2, StackTop(&obj->st1));
         StackPop(&obj->st1);
          }
     }
    int ret=StackTop(&obj->st2);
    StackPop(&obj->st2);
    return ret;
}

int myQueuePeek(MyQueue* obj) {
    if(StackEmpty(&obj->st2))    // 如果st2 为空 就把st1的数据倒过来
    {
            while(!StackEmpty(&obj->st1))  //如果st1不为空
         {
         StackPush(&obj->st2, StackTop(&obj->st1));
         StackPop(&obj->st1);
         }
    }
    int ret=StackTop(&obj->st2);
    return ret;
}

bool myQueueEmpty(MyQueue* obj) {
      return StackEmpty(&obj->st1)&&StackEmpty(&obj->st2);
}

void myQueueFree(MyQueue* obj) {
      StackDestroy(&obj->st1);
       StackDestroy(&obj->st2);
       free(obj);
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用栈实现队列的C语言代码如下: ```c #include <stdio.h> #include <stdlib.h> // 定义栈结构 typedef struct { int* data; // 存储数据的数组 int top; // 栈顶指针 int maxSize; // 栈的最大容量 } Stack; // 初始化栈 void initStack(Stack* stack, int maxSize) { stack->data = (int*)malloc(sizeof(int) * maxSize); stack->top = -1; stack->maxSize = maxSize; } // 判断栈是否为空 int isEmpty(Stack* stack) { return stack->top == -1; } // 判断栈是否已满 int isFull(Stack* stack) { return stack->top == stack->maxSize - 1; } // 入栈操作 void push(Stack* stack, int value) { if (isFull(stack)) { printf("Stack is full!\n"); return; } stack->data[++stack->top] = value; } // 出栈操作 int pop(Stack* stack) { if (isEmpty(stack)) { printf("Stack is empty!\n"); return -1; } return stack->data[stack->top--]; } // 使用栈实现队列 typedef struct { Stack* inStack; // 入队栈 Stack* outStack; // 出队栈 } MyQueue; // 初始化队列 void initQueue(MyQueue* queue, int maxSize) { queue->inStack = (Stack*)malloc(sizeof(Stack)); queue->outStack = (Stack*)malloc(sizeof(Stack)); initStack(queue->inStack, maxSize); initStack(queue->outStack, maxSize); } // 入队操作 void enqueue(MyQueue* queue, int value) { if (isFull(queue->inStack)) { printf("Queue is full!\n"); return; } // 将元素压入入队栈 push(queue->inStack, value); } // 出队操作 int dequeue(MyQueue* queue) { if (isEmpty(queue->outStack)) { // 如果出队栈为空,则将入队栈的元素依次弹出并压入出队栈 while (!isEmpty(queue->inStack)) { push(queue->outStack, pop(queue->inStack)); } } return pop(queue->outStack); } int main() { MyQueue queue; initQueue(&queue, 5); enqueue(&queue, 1); enqueue(&queue, 2); enqueue(&queue, 3); printf("%d\n", dequeue(&queue)); printf("%d\n", dequeue(&queue)); enqueue(&queue, 4); enqueue(&queue, 5); printf("%d\n", dequeue(&queue)); printf("%d\n", dequeue(&queue)); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

开拓的嚣张

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

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

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

打赏作者

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

抵扣说明:

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

余额充值