zoukankan      html  css  js  c++  java
  • 两个队列实现一个栈

      两个队列实现一个栈,写了两个栈实现一个队列后,基本上思路是比较清晰的...但我发现貌似就不能用O(1)时间的实现出栈,我自己想的是每次出栈,数据存放的队列就会换到另一个,进栈倒是不复杂,只用找到一个不是空的队列就好了。

      代码:

    #include <iostream>
    using namespace std;
    
    #define sizeOfBuffer 5
    
    struct Stack {
    	int val;
    	int base;
    	int top;
    }Queue1[sizeOfBuffer], Queue2[sizeOfBuffer];
    
    class MyFunc {
    
    public:
    	struct Stack* initStack(struct Stack* Q) {
    		Q = new struct Stack;
    		Q->base = Q->top = 0;
    
    		return Q;
    	}
    
    	bool PushStack(struct Stack* Q, int Data) {
    		if(Q->base != sizeOfBuffer && Q->top == 0) {
    			Queue1[Q->base++].val = Data;
    		} else if(Q->top != sizeOfBuffer && Q->base == 0) {
    			Queue2[Q->top++].val = Data;
    		} else return false;
    
    		return true;
    	}
    
    	bool PopStack(struct Stack* Q) {
    
    		if(Q->base == 0 && Q->top == 0)
    			return false;
    		else if(Q->base != 0 && Q->top == 0) {
    			while(--Q->base > 0) {
    				Queue2[Q->top] = Queue1[Q->top];
    				++Q->top;
    			}
    		}
    		else {
    			while(--Q->top > 0) {
    				Queue1[Q->base] = Queue2[Q->base];
    				++Q->base;
    			}
    		}
    
    		return true;
    	}
    
    	int GetStackCount(struct Stack* Q) {
    		return Q->base ? Q->base : Q->top;
    	}
    
    	void PrintStackMember(struct Stack* Q) {
    		int i = Q->base, j = Q->top;
    
    		while(i || j) {
    			cout << (i ? Queue1[--i].val : Queue2[--j].val) << ' ';
    		}
    	}
    };
    
    
    
    int main()
    {
    	struct Stack* SP = NULL;
    	int Data;
    	char Ch;
    
    	SP = MyFunc().initStack(SP);
    
    	cout << "1) 入栈		2) 出栈" << endl
    		<< "3) 栈		4) 个数" << endl
    		<< "5) 退出" << endl
    		<< "请输入对应的编号进行操作" << endl;
    
    	Ch = cin.get();
    	while(Ch != '5') {
    
    		switch(Ch) {
    		case '1' :	cout << "输入:" << endl;
    					cin >> Data;
    					MyFunc().PushStack(SP, Data) == true ? cout << "已入栈" << endl : cout << "Stack overflow!" << endl;
    				break;
    		case '2' :	MyFunc().PopStack(SP) == true ? cout << "已出栈" << endl : cout << "Stack underflow!" << endl;
    				break;
    		case '3' :	cout << "显示数据:" << endl;
    					MyFunc().PrintStackMember(SP);
    					cout << endl;
    				break;
    		case '4' :	cout << "当前栈个数:" << MyFunc().GetStackCount(SP) << endl;
    				break;
    		}
    		Ch = cin.get();
    	}
    
    	delete SP;
    	SP = NULL;
    	
    	return 0;
    }

      ...貌似也没什么好说的QAQ,就这样吧。

  • 相关阅读:
    Sublime Text3 无法调出package controll问题
    Python标准库-enumerate用法
    设计模式学习-简单工厂模式(python3)
    【IO流】java中文件路径(相对路径、绝对路径)相关类及方法
    nginx安装教程(详细)
    nginx -stream(tcp连接)反向代理配置 实现代理mysql以及文件上传
    【单例模式】懒汉式的线程安全问题 volatile的作用
    jsonp协议 java服务端、JQuery客户端 简单实现原理
    MyBatis原理,Spring、SpringBoot整合MyBatis
    【JavaSE】运行时类型信息(RTTI、反射)
  • 原文地址:https://www.cnblogs.com/darkchii/p/7780640.html
Copyright © 2011-2022 走看看