#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define eleType int
// 定义一个结构体队列
typedef struct {
eleType* elements; // 队列列表
size_t front; // 首元素索引
size_t rear; // 尾元素索引S
size_t capacity; // 队列容量
}Queue;
// 队列初始化
void Queuecreat(Queue* q){
q->elements = (eleType*)malloc(sizeof(eleType) * 8); // 分配八个eleType大小元素空间
q->front = 0; // 首元素索引为0
q->rear = 0; // 尾元素索引为0
q->capacity = 8; // 容量初始化为8
}
// 队列的销毁
void Queuedestroy(Queue* q){
free(q->elements); // 释放空间
q->front = 0;
q->rear = 0;
q->capacity = 0;
q->elements = NULL;
}
// 队列的扩容
void Queueresize(Queue* q){
eleType* newq = (eleType*)realloc(q->elements,sizeof(eleType)*(q->capacity * 2)); // 重新分配空间为原来的2倍
q->elements = newq; // 原来的更新为新的
q->capacity = q->capacity * 2; // 容量乘以2
}
// 入队
void Queuepush(Queue* q,eleType element){
if(q->rear == q->capacity){ // 如果队尾索引等于容量说明队列满了,进行扩容操作
Queueresize(q);
}
q->elements[q->rear++] = element; //
}
// 出队
eleType Queuepop(Queue* q){
if(q->front == q->rear){
printf(“空\n”);
exit(1);
}
return q->elements[q->front++];
}
// 获取队首元素
eleType Queuetop(Queue* q){
if(q->front == q->rear){
printf(“空\n”);
exit(1);
}
return q->elements[q->front];
}
// 获取队列大小
size_t Queuesize(Queue* q){
return q->rear - q->front; // 尾部索引减去头部索引就是队列大小
}
typedef struct{
Queue q1;
Queue q2;
}Mystack;
Mystack* Mystackcreat(){
Mystack* obj = (Mystack*)malloc(sizeof(Mystack));
Queuecreat(&obj->q1);
Queuecreat(&obj->q2);
return obj;
}
void MystackDestory(Mystack* obj){
Queuedestroy(&obj->q1);
Queuedestroy(&obj->q2);
}
void Mystackpush(Mystack* obj,int element){
Queuepush(&obj->q1,element);
}
int Mystackpop(Mystack* obj){
while(Queuesize(&obj->q1) > 1){
Queuepush(&obj->q2,Queuepop(&obj->q1));
}
int value = Queuepop(&obj->q1);
while(Queuesize(&obj->q2) > 0){
Queuepush(&obj->q1,Queuepop(&obj->q2));
}
return value;
}
int Mystacktop(Mystack* obj){
while(Queuesize(&obj->q1) > 1){
Queuepush(&obj->q2,Queuepop(&obj->q1));
}
int value = Queuepop(&obj->q1);
Queuepush(&obj->q2,value);
while(Queuesize(&obj->q2) > 0){
Queuepush(&obj->q1,Queuepop(&obj->q2));
}
return value;
}
bool Mystackempty(Mystack* obj){
return Queuesize(&obj->q1) == 0;
}
int main(){
Mystack* stk = Mystackcreat();
Mystackpush(stk,10);
Mystackpush(stk,20);
Mystackpush(stk,30);
while(!Mystackempty(stk)){
printf(“top is %d\n”,Mystacktop(stk));
printf(“pop is %d\n”,Mystackpop(stk));
}
MystackDestory(stk);
return 0;
}