力扣用队列实现栈

力扣用队列实现栈_第1张图片

自己写的栈,再让其他函数去调用自己写的栈

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.一个结构体包含俩个队列

力扣用队列实现栈_第2张图片

typedef struct {
   Queue q1;//第一个队列
   Queue q2;//第二个队列
} MyStack;

2.希望创造一个包含两个队列的结构体,并且把这样的结构返回去,通过MyStack结构体一把molloc两个队列结构体

力扣用队列实现栈_第3张图片


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队列,若是两个队列都是空就把新数据随便入一个队列

力扣用队列实现栈_第4张图片

  //插入数据
void myStackPush(MyStack* obj, int x) {
    if(!QueueEmpty(&obj->q1))
    {
        QueuePush(&obj->q1, x);
    }
    else
    {
         QueuePush(&obj->q2, x); 
    }
}

4.用两个队列像一个要像一个栈一样出数据取数据,把q1队列的数据倒q2,倒到了最后一个元素再去返回和删除元素

力扣用队列实现栈_第5张图片

  //移除并返回栈顶元素
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.程序结束销毁所有建立的空间避免内存泄漏

力扣用队列实现栈_第6张图片

//释放数据
void myStackFree(MyStack* obj) {
  QueueDestroy(&obj->q1);
  QueueDestroy(&obj->q2);
  free(obj);
}

你可能感兴趣的:(leetcode,算法,职场和发展)