面试题7:用两个栈实现队列
2015-10-23 22:00
309 查看
#include<iostream> //思路:定义两个栈 //往pTopOne中压入栈中 //如果pTopTwo知否为空 // 1.若为空 如果栈pTopOne为空 返回-1 // 不为空 将栈pTopOne 中的 出栈 全部拿到栈pTopTwo // 2.不为空直接 将栈 pTopTwo 出栈 using namespace std; //定义栈的结构体 struct Stack { int nValue; Stack *pNext; }; //压栈 void Push(Stack **pTop,int nValue) { if(pTop == NULL) { return ; } Stack *pStack= new Stack; pStack->nValue = nValue; pStack->pNext = (*pTop);//栈顶指针移动 (*pTop) = pStack;//新来的结点 为栈顶 } //出栈 int Pop(Stack **pTop) { if(pTop == NULL ||(*pTop) == NULL) { return -1; } Stack *pDel = (*pTop);//标记要删除的栈顶 int nValue =pDel->nValue; (*pTop) = (*pTop)->pNext;//栈顶指针移动 delete pDel ; pDel = NULL; return nValue; } void PushQueue(Stack **pTopOne,int nValue) { if(pTopOne == NULL) { return ; } Push(pTopOne,nValue);//将 元素 压入 栈pTopOne中 } int PopQueue(Stack **pTopOne,Stack **pTopTwo) { int nValue ; if((*pTopTwo) == NULL)//如果栈 pTopTwo 为空 { if((*pTopOne) == NULL)//如果栈 pTopTwo 为空 ,没有元素 返回 -1 { return -1; } while(/*(*pTopOne)!=NULL*/(nValue=Pop(pTopOne))!=-1)//栈 pTopOne 不为空 ,全部压入栈 pTopTwo中 { Push(pTopTwo,nValue); } } return Pop(pTopTwo);//返回 pTopTwo 栈顶 } int main() { Stack *pTopOne = NULL; Stack *pTopTwo = NULL; PushQueue(&pTopOne,1); cout<<PopQueue(&pTopOne,&pTopTwo)<<endl; cout<<PopQueue(&pTopOne,&pTopTwo)<<endl; PushQueue(&pTopOne,2); PushQueue(&pTopOne,3); cout<<PopQueue(&pTopOne,&pTopTwo)<<endl; PushQueue(&pTopOne,4); PushQueue(&pTopOne,5); cout<<PopQueue(&pTopOne,&pTopTwo)<<endl; cout<<PopQueue(&pTopOne,&pTopTwo)<<endl; cout<<PopQueue(&pTopOne,&pTopTwo)<<endl; cout<<PopQueue(&pTopOne,&pTopTwo)<<endl; PushQueue(&pTopOne,6); PushQueue(&pTopOne,7); cout<<PopQueue(&pTopOne,&pTopTwo)<<endl; cout<<PopQueue(&pTopOne,&pTopTwo)<<endl; cout<<PopQueue(&pTopOne,&pTopTwo)<<endl; system("pause"); return 0; } #include<iostream> #include<stack> using namespace std; template<typename T> class CQueue { public : CQueue(); ~CQueue(); void appendTail(const T &node); T deleteHead(); private: stack<T> stack1; stack<T> stack2; }; template<typename T> CQueue<T>::CQueue() { } template<typename T> CQueue<T>::~CQueue() { while(!stack1.empty()) { stack1.pop(); } while(!stack2.empty()) { stack2.pop(); } } template<typename T> void CQueue<T>::appendTail(const T &node) { stack1.push(node); } template<typename T> T CQueue<T>::deleteHead() { if(stack2.empty() == true) { while(stack1.size()>0) { stack2.push(stack1.top()); stack1.pop(); } } T head = stack2.top(); stack2.pop(); return head; } int main() { CQueue<int> queue; for(int i=0;i< 10;i++) { queue.appendTail(i); } for(int i=0;i<10;i++) { cout<<queue.deleteHead()<<endl; } system("pause"); return 0; }
相关文章推荐
- 【程序员眼中的统计学(9)】总体和样本的估计:进行预测
- 关于java异常处理的面试题
- 黑马程序员—————— Java集合框架Collection
- 2.有人认为,“中文编程”是解决中国程序员编程效率的秘密武器,请问它是一个“银弹”么?
- 黑马程序员——————Java单例模式
- 黑马程序员——Java 基础:静态
- 黑马程序员-------- Java抽象和接口的学习和笔记
- 黑马程序员——Java中的IO流(下)
- 【读书笔记】程序员的自我修养总结(三)
- 编程面试题在线训练平台:判断字符串是否没有重复字符
- Java异常错误的面试题及答案
- 黑马程序员——图形化界面
- 程序员必备知识——fork和exec函数详解
- 黑马程序员——反射
- JAVA面试题1
- 有人认为,“中文编程”是解决中国程序员编程效率的秘密武器,请问它是一个“银弹”么?
- 谈谈.Net技术面试
- 程序员你需要的技能都在这里
- Java常见面试题及答案 21-30(集合类)
- 【扣丁学堂】 程序员的眼中钉,肉中刺- BUG!