#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; }