题目描述:请你仅用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现MyQueque类:
void push(int x)将元素x推到队列的末尾
int pop()从队列的开头移除元素并返回元素
int peek()返回队列开头的元素
boolean empty()如果队列为空,返回true;否则,返回false
思路:创建两个栈pushST、popST,分别用来入队列和出队列入队列:直接往pushST插入数据出队列:popST不为空出数据,如果为空把pushST里的数据倒过来后再出数据。
tips:栈:先进后出 队列:先进先出
用c语言编写
typedef struct {
int* arr;
int front;
int rear;
int capacity;
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* pst = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
// 多申请一个单元
pst->arr = (int*)malloc(sizeof(int)*(k+1));
pst->front = pst->rear = 0;
pst->capacity = k;
return pst;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
assert(obj);
return obj->front == obj->rear;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
assert(obj);
return (obj->rear+1)%(obj->capacity+1) == obj->front;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
assert(obj);
if(myCircularQueueIsFull(obj)) {
return false;
}
obj->arr[obj->rear] = value;
obj->rear++;
obj->rear %= obj->capacity+1;
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
assert(obj);
if(myCircularQueueIsEmpty(obj)) {
return false;
}
obj->front++;
obj->front %= obj->capacity+1;
return true;
}
int myCircularQueueFront(MyCircularQueue* obj) {
assert(obj);
if(myCircularQueueIsEmpty(obj)) {
return -1;
}
return obj->arr[obj->front];
}
int myCircularQueueRear(MyCircularQueue* obj) {
assert(obj);
if(myCircularQueueIsEmpty(obj)) {
return -1;
}
int prevRear = obj->rear-1;
if(obj->rear == 0) {
prevRear = obj->capacity;
}
return obj->arr[prevRear];
}
void myCircularQueueFree(MyCircularQueue* obj) {
assert(obj);
free(obj->arr);
free(obj);
}