当前位置: 首页 > news >正文

(力扣)用两个栈实现队列

 这里是栈的源代码:栈和队列的实现

当然,自己也可以写一个栈来用,对题目来说不影响,只要符合栈的特点就行。

题目:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

题解: 

做题前需要的栈:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int DataType;
typedef struct Stack
{DataType* data;int top;int capacity;
}Stack;void Init(Stack *st);
void Push(Stack* st, DataType x);
void Pop(Stack* st);
DataType GetTop(Stack* st);
bool Empty(Stack* st);
void Destroy(Stack* st);
int Size(Stack* st);void Init(Stack* st)
{assert(st);st->data = NULL;st->top = 0;st->capacity = 0;
}void Push(Stack* st, DataType x)
{assert(st);if (st->capacity == st->top){int newcapacity = (st->capacity == 0) ? 4 : st->capacity * 2;DataType* temp = (DataType*)realloc(st->data, sizeof(DataType) * newcapacity);if (temp == NULL){perror("realloc fail");exit(-1);}st->data = temp;st->capacity = newcapacity;}st->data[st->top++] = x;
}void Pop(Stack* st)
{assert(st);assert(st->top > 0);st->top--;
}DataType GetTop(Stack* st)
{assert(st);assert(st->top > 0);return st->data[st->top - 1];
}bool Empty(Stack* st)
{assert(st);return (st->top == 0);
}void Destroy(Stack* st)
{assert(st);free(st->data);st->data = NULL;st->top = st->capacity = 0;}int Size(Stack* st)
{assert(st);return st->top;
}


 

题目正题:  


​
//定义出两个栈
typedef struct 
{Stack push;Stack pop;
} MyQueue;​

//初始化队列
MyQueue* myQueueCreate() 
{MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));Init(&obj->push);Init(&obj->pop);return obj;
}

//向队列中插入元素
void myQueuePush(MyQueue* obj, int x) 
{Push(&obj->push,x);
}

//元素出队列
int myQueuePop(MyQueue* obj) 
{int ret = myQueuePeek(obj);Pop(&obj->pop);return ret;
}

//返回队列开头的元素
int myQueuePeek(MyQueue* obj) 
{if(Empty(&obj->pop)){int size = Size(&obj->push);for(int i=0; i<size; i++){Push(&obj->pop,GetTop(&obj->push));Pop(&obj->push);}}return GetTop(&obj->pop);
}

//判断队列是否为空
bool myQueueEmpty(MyQueue* obj) 
{return Empty(&obj->pop) && Empty(&obj->push);
}

//销毁队列
void myQueueFree(MyQueue* obj) 
{free((&obj->push)->data);free((&obj->pop)->data);free(obj);
}

Lei宝啊:我的主页鸭

愿所有美好如期而遇

http://www.lryc.cn/news/116218.html

相关文章:

  • 【自动化测试框架】关于unitttest你需要知道的事
  • 手机便签中可以打勾的圆圈或小方块怎么弄?
  • 【Linux】gdb 的使用
  • C++11之右值引用
  • 【PHP的设计模式】
  • React 之 Redux - 状态管理
  • 集合转数组
  • 使用Python将Word文档转换为PDF的方法
  • Java 判断一个字符串在另一个字符串中出现的次数
  • 设计模式十三:代理(Proxy Pattern)
  • Redis基础 (三十八)
  • maven中的scope
  • 【网络基础实战之路】实现RIP协议与OSPF协议间路由交流的实战详解
  • CNN(四):ResNet与DenseNet结合--DPN
  • 汽车EBSE测试流程分析(四):反思证据及当前问题解决
  • 如何在Spring MVC中使用@ControllerAdvice创建全局异常处理器
  • 2023/08/05【网络课程总结】
  • log_softmax比softmax更好?
  • [LeetCode - Python]344.反转字符串(Easy);345. 反转字符串中的元音字母(Easy);977. 有序数组的平方(Easy)
  • 【SOP】最佳实践之 TiDB 业务写变慢分析
  • 带有参数的 PL/SQL 过程/函数从选择查询返回表
  • 文件的权限
  • vue3集成echarts最佳实践
  • 一位年薪40W的测试被开除,回怼的一番话,令人沉思
  • 网络适配器和MAC地址
  • react-player静音不能自动播放问题
  • 培训Java技术要多久才能学会?答案都在这里啦
  • Java中使用HttpPost发送form格式的请求
  • C语言----字节对齐
  • Next.js入门介绍(服务端渲染)