力扣用队列实现栈
自己写的栈,再让其他函数去调用自己写的栈
typedef int QDataType;
typedef struct QueueNode
{struct QueueNode* next;//单链表QDataType data;//放数据
}QNode;typedef struct Queue
{QNode* phead;//头节点QNode* ptail;//尾节点QDataType size; //统计有多少节点
}Queue;void QueueInit(Queue *pq);//初始化
void QueueDestroy(Queue*pq);//销毁
void QueuePush(Queue*pq,QDataType x);//插入数据
void QueuePop(Queue* pq);//队头出数据就是删队头
QDataType QueueFront(Queue* pq);//返回对头数据
QDataType QueueBack(Queue* pq);//返回队尾数据
int QueueSize(Queue* pq);//返回总的数据个数
bool QueueEmpty(Queue* pq);//是空的返回真void QueueInit(Queue* pq)//初始化
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}void QueueDestroy(Queue* pq)//销毁
{assert(pq);//第一个结构体QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}void QueuePush(Queue* pq, QDataType x)//插入数据
{ QNode* newnode = (QNode*)malloc(sizeof(QNode));//扩大的是第一个结构体if (newnode == NULL){perror("malloc");return;}newnode->data = x;newnode->next = NULL;if (pq->phead == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}void QueuePop(Queue* pq)//队头出数据就是删队头
{assert(pq);assert(!QueueEmpty(pq));if (pq->phead->next == NULL){free(pq->phead);pq->phead = pq->ptail = NULL;}else{QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}QDataType QueueFront(Queue* pq)//返回对头数据
{assert(pq);assert(!QueueEmpty(pq));return pq->phead->data;
}QDataType QueueBack(Queue* pq)//返回队尾数据
{assert(pq);assert(!QueueEmpty(pq));return pq->ptail->data;
}int QueueSize(Queue* pq)//返回总的数据个数
{assert(pq);return pq->size;
}bool QueueEmpty(Queue* pq)//是空的返回真
{assert(pq);return pq->phead == NULL && pq->ptail == NULL;
}
1.一个结构体包含俩个队列
typedef struct {Queue q1;//第一个队列Queue q2;//第二个队列
} MyStack;
2.希望创造一个包含两个队列的结构体,并且把这样的结构返回去,通过MyStack结构体一把molloc两个队列结构体
MyStack* myStackCreate() {MyStack*obj = (MyStack*)malloc(sizeof(MyStack));if(obj == NULL){perror("molloc");}QueueInit(&obj->q1);QueueInit(&obj->q2);return obj;
}
3.插入数据,q1队列有数据就进入(if语句)把新数据插入q1队列,q1队列没数据就把新数据插入q2队列,若是两个队列都是空就把新数据随便入一个队列
//插入数据
void myStackPush(MyStack* obj, int x) {if(!QueueEmpty(&obj->q1)){QueuePush(&obj->q1, x);}else{QueuePush(&obj->q2, x); }
}
4.用两个队列像一个要像一个栈一样出数据取数据,把q1队列的数据倒q2,倒到了最后一个元素再去返回和删除元素
//移除并返回栈顶元素
int myStackPop(MyStack* obj) {//空数据队列Queue* PEmptyQ = &obj->q1;//有数据队列Queue* PNonEmptyQ = &obj->q2;//假设空数据和有数据队列假设赋值错了if(!QueueEmpty(&obj->q1)){PEmptyQ = &obj->q2;PNonEmptyQ = &obj->q1;}//倒数据while(QueueSize(PNonEmptyQ) > 1){QueuePush(PEmptyQ,QueueFront(PNonEmptyQ));QueuePop(PNonEmptyQ);}int top = QueueFront(PNonEmptyQ);//调用了取对头数据函数QueuePop(PNonEmptyQ);//调用了删除队头数据函数return top;
}
5.返回栈顶数据,就是返回队列的队尾数据
//取栈顶元素
int myStackTop(MyStack* obj) {if(!QueueEmpty(&obj->q1)){return QueueBack(&obj->q1);//调用了取队尾的数据的函数}else{return QueueBack(&obj->q2);//调用了取队尾的数据的函数}
}
6.判创建的MyStack结构体q1和q2地址是不是空,如果是空的则标题2创建结构体失败了molloc也失败了
bool myStackEmpty(MyStack* obj) {return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}
7.程序结束销毁所有建立的空间避免内存泄漏
//释放数据
void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}