@ 代码随想录算法训练营第二周(C语言)|Day10(栈与队列)
Day10、栈与队列(包含题目 232.用栈实现队列225. 用队列实现栈)
232.用栈实现队列
题目描述
使用栈实现队列的下列操作:
push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。
题目解答
typedef struct {
int stack1[100];
int stack2[100];
int leng1;
int leng2;
} MyQueue;
MyQueue* myQueueCreate() {
MyQueue* queue=(MyQueue*)malloc(sizeof(MyQueue));
queue->leng1=0;
queue->leng2=0;
return queue;
}
void myQueuePush(MyQueue* obj, int x) {
obj->stack1[obj->leng1++]=x;
}
int myQueuePop(MyQueue* obj) {
int inleng1=obj->leng1;
int outleng2=obj->leng2;
if(outleng2==0){
while(inleng1!=0){
obj->stack2[--inleng1]=obj->stack1[outleng2++];
}
}
int res=obj->stack2[--outleng2];
//注意是--outleng2
while(outleng2!=0){
obj->stack1[--outleng2]=obj->stack2[inleng1++];
}
obj->leng1=inleng1;
obj->leng2=outleng2;
return res;
}
int myQueuePeek(MyQueue* obj) {
return obj->stack1[0];
}
bool myQueueEmpty(MyQueue* obj) {
if(obj->leng1==0&&obj->leng2==0){
return true;
}
return false;
}
void myQueueFree(MyQueue* obj) {
obj->leng1=0;
obj->leng2=0;
}
题目总结
两个栈实现一个队列。
225. 用队列实现栈
题目描述
使用队列实现栈的下列操作:
push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空
题目解答
typedef struct {
int d[101]; // capacity 100, 多一个元素用于方便判空判满(本例只需要判空)
int cap;
int front;
int rear;
} Q;
Q* qNew() {
Q *q = malloc(sizeof(Q));
q->cap = 101;
q->front = q->rear = 0;
return q;
}
void qPush(Q *q, int n) {
q->d[q->rear] = n;
q->rear = (q->rear + 1) % q->cap;
}
int qOffer(Q *q) {
int front = q->d[q->front];
q->front = (q->front + 1) % q->cap;
return front;
}
bool qIsEmpty(Q *q) {
return q->front == q->rear;
}
typedef struct {
Q *q1;
Q *q2;
} MyStack;
MyStack* myStackCreate() {
MyStack *stk = malloc(sizeof(MyStack));
stk->q1 = qNew();
stk->q2 = qNew();
return stk;
}
void myStackPush(MyStack* obj, int x) {
// push into q2, move all elements in q1 to q2
qPush(obj->q2, x);
while (!qIsEmpty(obj->q1)) {
qPush(obj->q2, qOffer(obj->q1));
}
// swap q1, q2
Q *tmp = obj->q1;
obj->q1 = obj->q2;
obj->q2 = tmp;
}
int myStackPop(MyStack* obj) {
return qOffer(obj->q1);
}
int myStackTop(MyStack* obj) {
return obj->q1->d[obj->q1->front];
}
bool myStackEmpty(MyStack* obj) {
return qIsEmpty(obj->q1);
}
void myStackFree(MyStack* obj) {
free(obj->q1);
free(obj->q2);
free(obj);
}
题目总结
先构造出队列,再做。