两个队列实现一个栈(二)

2014-11-23 21:59:41 · 作者: · 浏览: 14
urn false; } /* 进队函数,从队尾进队,队头指针保持不变 */ void en_queue(PQUEUE pS, int e) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(!pNew) { printf(pNew malloc failed); exit(-1); } else { pNew->data = e; pNew->pNext = NULL; pS->rear->pNext = pNew; pS->rear = pNew; } return; } /* 出队函数,从队头出队,队尾指针保持不变,但当最后一个元素出队时, 需要对队尾指针重新赋值,使其指向头结点 */ bool de_queue(PQUEUE pS,int *pData) { if(is_empty(pS)) return false; else { PNODE p = pS->front->pNext; *pData = p->data; pS->front->pNext = p->pNext; //这里是队列头元素出队的特殊情况,一般情况下,删除队头元素时 //仅需修改头结点中的指针,但当队列中最后一个元素被删除时, //队列尾指针也丢失了,因此需对队尾指针重新赋值(指向头结点)。 if(pS->rear == p) pS->rear = pS->front; free(p); } return true; } /* 遍历队列,从对头向队尾依次输出队中的元素 */ void traverse_queue(PQUEUE pS) { if(is_empty(pS)) printf(there is no data in the queue! ); else { PNODE pCurrent = pS->front->pNext; printf(Now datas int the queue are: ); while(pCurrent) { printf(%d ,pCurrent->data); pCurrent = pCurrent->pNext; } printf( ); } return; } /* 求队列的长度 */ int length(PQUEUE pS) { int count = 0; PNODE pCurrent = pS->front->pNext; while(pCurrent) { count++; pCurrent = pCurrent->pNext; } return count; } /* 销毁队列,头结点也被销毁,最后也将pS节点销毁,并将其指向为空,避免垂直指针的产生 */ void destroy_queue(PQUEUE pS) { if(is_empty(pS)) return; else { while(pS->front) { pS->rear = pS->front->pNext; free(pS->front); pS->front = pS->rear; } } free(pS); pS = 0; return; } /* 用两个队列模拟入栈操作 */ void push(PQUEUE pS1,PQUEUE pS2,int val) { if(is_empty(pS2)) en_queue(pS1, val); else en_queue(pS2, val); } /* 用两个队列模拟出栈操作 */ bool pop(PQUEUE pS1,PQUEUE pS2,int *pData) { if(is_empty(pS1) && is_empty(pS2)) return false; int DelData; if(!is_empty(pS2)) { int len = length(pS2); while(len-- > 1) { de_queue(pS2,&DelData); en_queue(pS1,DelData); } //将队列的最后一个元素出队,作为出栈元素 de_queue(pS2,pData); return true; } if(!is_empty(pS1)) { int len = length(pS1); while(len-- > 1) { de_queue(pS1,&DelData); en_queue(pS2,DelData); } //将队列的最后一个元素出队,作为出栈元素 de_queue(pS1,pData); return true; } }

测试结果:

/