7.用两个队列 实现 栈

    xiaoxiao2025-02-28  52

    #include<stdio.h> #include<stdlib.h> typedef struct node {     int nValue;     struct node* pNext; }Node; typedef struct queue {     int nCount;     Node* pHead;     Node* pTail; }Queue; typedef struct stack {     int nCount;     Queue* pQueue1;     Queue* pQueue2; }Stack; /* 栈:先进后出,顶进顶出 队:先进先出,尾进头出(入队类型链表添加节点) */ /* 根据队的性质,实现栈:栈push和栈一致; 栈pop的话,我们利用两个队列实现,去掉push--->pQueue里面的最后一个元素(去掉的不会push到另一队),这样再将原队里的pop出来, (通俗说就是q1去掉尾元素压入q2) */ void InitQueue(Queue** pQueue) {     *pQueue = (Queue*)malloc(sizeof(Queue));     (*pQueue)->nCount = 0;     (*pQueue)->pHead = NULL;     (*pQueue)->pTail=NULL; } void PushQueue(Queue* pQueue,int value) {     if(pQueue == NULL)return;     Node* pTemp = NULL;     int Num;     pTemp = (Node*)malloc(sizeof(Node));     pTemp->nValue=value;     pTemp->pNext = NULL;     if(pQueue->pHead == NULL)     {         pQueue->pHead = pTemp;         }     else     {         pQueue->pTail->pNext = pTemp;;         }     pQueue->pTail = pTemp;     pQueue->nCount++; } int PopQueue(Queue* pQueue) {     if(pQueue->nCount == 0 || pQueue == NULL)return -1;

        Node* Del = NULL;     int num;     Del = pQueue->pHead;     num = Del->nValue;     pQueue->pHead = pQueue->pHead->pNext;          free(Del);     Del = NULL;     pQueue->nCount--;     if(pQueue->nCount == 0)     {         pQueue->pTail =NULL;     }     return num; } //队实现栈 void InitStack(Stack** pStack) {     *pStack = (Stack*)malloc(sizeof(Stack));     (*pStack)->nCount = 0;     (*pStack)->pQueue1 = NULL;     (*pStack)->pQueue2 = NULL;     InitQueue(&((*pStack)->pQueue1));     InitQueue(&((*pStack)->pQueue2));     } void PushStack(Stack* pStack,int num) {     if(pStack == NULL || pStack->pQueue1 == NULL || pStack->pQueue2 == NULL )return;     if(pStack->pQueue1->nCount != 0)     {         PushQueue(pStack->pQueue1,num);         }     else     {         PushQueue(pStack->pQueue2,num);         }     pStack->nCount++;     } int PopStack(Stack* pStack) {     if(pStack == NULL || pStack->pQueue1 == NULL || pStack->pQueue2 == NULL || pStack->nCount==0 )return -1;     //去掉q1的最后一个元素 压入 q2     int Num;     if(pStack->pQueue1->nCount != 0)     {         //count>0说明可以出队         while(pStack->pQueue1->nCount > 1)         {             //没到最后一个就一直push到q2             PushQueue(pStack->pQueue2,PopQueue(pStack->pQueue1));             }         Num = PopQueue(pStack->pQueue1);         }     else//q1为0     {         while(pStack->pQueue2->nCount > 1)         {             PushQueue(pStack->pQueue1,PopQueue(pStack->pQueue2));             }         Num = PopQueue(pStack->pQueue2);         }     //把最后一个取出来     pStack->nCount--;     return Num;          } int main() {     Stack* MyStack=NULL;     InitStack(&MyStack);     PushStack(MyStack,6);     PushStack(MyStack,4);     PushStack(MyStack,12);     PushStack(MyStack,67);     PushStack(MyStack,69);     printf("出栈值%d\n",PopStack(MyStack));     printf("出栈值%d\n",PopStack(MyStack));     printf("出栈值%d\n",PopStack(MyStack));     printf("出栈值%d\n",PopStack(MyStack));     printf("出栈值%d\n",PopStack(MyStack));     return 0; }

    最新回复(0)