class CQueue {
Stack<Integer> A;
Stack<Integer> B;
public CQueue() {
A = new Stack<Integer>();
B = new Stack<Integer>();
}
public void appendTail(int value) {
A.push(value);
}
public int deleteHead() {
if(!B.isEmpty()){
return B.pop();
}
if(A.isEmpty()){
return -1;
}
while(!A.isEmpty()){
B.push(A.pop());
}
return B.pop();
}
}
class CQueue:
def __init__(self):
self.stack1 = []
self.stack2 = []
def appendTail(self, value: int) -> None:
self.stack1.append(value)
def deleteHead(self) -> int:
if not self.stack1 and not self.stack2:
return -1
if not self.stack2:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
class CQueue {
LinkedList<Integer> A,B;
public CQueue() {
A = new LinkedList<>();
B = new LinkedList<>();
}
public void appendTail(int value) {
A.addLast(value);
}
public int deleteHead() {
if(!B.isEmpty()) return B.removeLast();
else if(A.isEmpty()) return -1;
else{
while(!A.isEmpty())
B.addLast(A.removeLast());
}
return B.removeLast();
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
class CQueue:
def __init__(self):
self.A, self.B = [], []
def appendTail(self, value: int) -> None:
self.A.append(value)
def deleteHead(self) -> int:
if self.B: return self.B.pop()
if not self.A: return -1
while self.A:
self.B.append(self.A.pop())
return self.B.pop()
# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()
class CQueue {
Stack<Integer> s1;
Stack<Integer> s2;
public CQueue() {
s1 = new Stack<Integer>();
s2 = new Stack<Integer>();
}
public void appendTail(int value) {
s1.add(value);
}
public int deleteHead() {
if (s1.isEmpty() && s2.isEmpty()){
return -1;
}
if (s2.isEmpty()){
while (!s1.isEmpty()){
s2.add(s1.pop());
}
}
return s2.pop();
}
}
共以下 34 个回答
“””
/*
使用两个栈的目的是,这种方式刚好能模拟成队列的出入栈方式
*/
#define MAX_LEN 10000
typedef struct {
int topA;
int topB;
int *stackA;
int *stackB;
} CQueue;
CQueue* cQueueCreate() {
// 申请堆区内存
CQueue cq = (CQueue)calloc(1, sizeof(CQueue));
if (cq NULL) {
return NULL;
}
// stackA申请堆区空间
cq->stackA = (int)calloc(MAX_LEN, sizeof(int));
if (cq->stackA NULL) {
free(cq);
return NULL;
}
// stackB申请堆区空间
cq->stackB = (int)calloc(MAX_LEN, sizeof(int));
if (cq->stackB NULL) {
free(cq->stackA);
free(cq);
return NULL;
}
// 定义大小
cq->topA = -1;
cq->topB = -1;
}
void cQueueAppendTail(CQueue* obj, int value) {
// 直接stackA尾部添加
if (obj->topA < MAX_LEN) {
obj->stackA[++obj->topA] = value;
}
}
int cQueueDeleteHead(CQueue* obj) {
// 若stackB存在值则直接操作
if (obj->topB >= 0) {
return obj->stackB[obj->topB–];
}
// 否则将stackA的值放入stackB
if (obj->topA >= 0) {
while(obj->topA >= 0) {
int tmp = obj->stackA[obj->topA–];
obj->stackB[++obj->topB] = tmp;
}
return obj->stackB[obj->topB–];
}
// 均没有值返回-1
return -1;
}
void cQueueFree(CQueue* obj) {
// 先释放内部的指针,最后释放外部
if (obj != NULL) {
if (obj->stackA != NULL) { free(obj->stackA);}
if (obj->stackB != NULL) { free(obj->stackB);}
free(obj);
}
}
“””
思路
解题方法
复杂度
时间复杂度:
空间复杂度:
Code
#python题解:
#
class CQueue(object):
class CQueue:
时间复杂度:O(N)
空间复杂度:O(N)
lass CQueue {
public:
CQueue() {
private: inStack, outStack; // 一个用于插入元素的栈,一个用于删除元素的栈
stack
};
struct stack{
int * data;
int top;
int size;
};
struct queue{
struct stack * stack1;
struct stack * stack2;
};
void initStack(struct stack *s,int size)
{
s->data = (int *)malloc(sizeof(int) * size);
s->top = -1;
s->size = size;
}
int catEmpty(struct stack * s)
{
return (s->top -1);
}
int catFull(struct stack *s)
{
return (s->top s->size -1);
}
void push(struct stack * ,int val)
{
if(catEmpty(s))
{
return ;
}
s->data[++(s->top)] = val;//压栈
}
int pop(struct stack *s)
{
if(catEmpty(s))
{
return -1;
}
return s->data[(s->top)–];//出栈
}
void initQueue(struct queue que,int size)
{
que->stack1 = (struct queue)malloc(sizeof(struct queue));
que->stack2 = (struct queue*)malloc(sizeof(struct queue));
initStack(queue->stack1,size);
initStack(queue->stack2,size);
}
int catQueue(struct queue* que)
{
return (catEmpty(que->stack1)&&catEmpty(que->stack2));
}
void inputQue(struct queue* que,int val)
{
if(catFull(que->stack1))
{
return;
}
}
int deQue(struct queue* que)
{
if(catQueue(que)
{
return -1;
}
}时间复杂度o(n),空间复杂度o(n)
时间复杂度:O(n^2), 空间复杂度:O(n)
两个栈一个用于正向存储,一个反向存储,在正向存储的栈中直接添加整数,删除整数时先判断反向存储的栈中有没有值,有则pop反向栈,无则将正向栈中的值存储到反向栈中再pop
//根据栈的先进后出以及队列先进先出的原理, stack1; stack2;
//用第一个栈模拟队列的先进,另一个辅助栈来模拟队列的先出。
//时间复杂度为o(1);
//空间复杂度为o(n);
class CQueue {
public:
stack
stack
CQueue() {}
};
一个栈用作入,一个栈用作出;pop队列时如果出栈为空,则从入栈中取出一个放到出栈
时间复杂度:o(n)
空间复杂度:o(1)
时间复杂度:O(n),空间复杂度:O(n) stack1; stack2;
class CQueue {
public:
stack
stack
CQueue() {
};
时间复杂度O(n),空间复杂度O(n)
时间复杂度:O(n),空间复杂度:O(n)
空间On 插入O1 弹出On
打卡
class CQueue { stack1; stack2; stack1 = new Stack (); stack2 = new Stack ();
public Stack
public Stack
public CQueue() {
Stack
Stack
}
}
用链表实现栈,用栈实现队列
class CQueue { inStack, outStack;
private:
stack
void in2out(){
while(!inStack.empty()){
outStack.push(inStack.top());
inStack.pop();
}
}
public:
CQueue() {
};
时间O(n) 空间O(n)
class CQueue:
1、简答题,两个stack之间的push和pop
一个栈用来压入数据,一个栈用来弹出数据,有弹出数据时第二个栈中内容
用两个栈来模拟
“`python
还是比较好想的。
class CQueue:
Your CQueue object will be instantiated and called as such:
obj = CQueue()
obj.appendTail(value)
param_2 = obj.deleteHead()
“`python
时间复杂度: 入队: O(1) 出队: O(n)
使用两个stack 一个用来储存准备弹出的value 一个用来压入新进来的元素, 当弹出的stack不为空时则不用考虑压入的stack, 直接弹出就行,因为队列本来就是FIFO, 而如果弹出的stack为空则需要判断压入的stack是否为空, 如果不是的话需要先将元素从压入的stack 全部弹出并依序压入另一个stack后再弹出最上面的那个元素
两个栈一个负责压入,一个负责弹出,弹出栈如果不为空,则不需要考虑压入栈,可直接弹出,因为弹出栈的元素一定是比压入栈先弹出。
“`cpp st1; st2;
class CQueue {
public:
stack
stack
CQueue() {
};
思路,俩栈,俩栈顶一个代表rear,一个front;添加data[++q.rear]=value,jiandehua1 循环while(obj->rear >= 0){obj->stack2[++(obj->front)] = obj->stack1[(obj->rear)–];int value = obj->stack2[(obj->front)–];//二栈等于一栈逆序但st1的倒数第二等于st2的top,实现了队列删除一个的元素
‘’javatypedef struct {
int* stack1;
int* stack2;
int rear;
int front;
} CQueue;
CQueue* cQueueCreate() {
CQueue* obj = (CQueue)malloc(sizeof(CQueue));
obj->stack1 = (int)malloc(1000sizeof(int));
obj->stack2 = (int)malloc(1000*sizeof(int));
obj->rear = -1;
obj->front = -1;
return obj;
}
void cQueueAppendTail(CQueue* obj, int value) {
obj->stack1[++(obj->rear)] = value; //
}
int cQueueDeleteHead(CQueue* obj) {
if(obj->front -1){
if(obj->rear -1){
return -1;//表示两个栈都为空
}
while(obj->rear >= 0){
obj->stack2[++(obj->front)] = obj->stack1[(obj->rear)–];
}
}
int value = obj->stack2[(obj->front)–];
return value;
}
void cQueueFree(CQueue* obj) {
free(obj->stack1);
free(obj->stack2);
free(obj);
}
/**
* Your CQueue struct will be instantiated and called as such:
* CQueue* obj = cQueueCreate();
* cQueueAppendTail(obj, value);
int param_2 = cQueueDeleteHead(obj);
cQueueFree(obj);
*/
‘’
模拟队列
// 模拟队列
class CQueue {
public:
CQueue() {
private: s1; s2;
std::stack
std::stack
};