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,就这样吧。

  • 相关阅读:
    Objective C
    MySQL 存储过程,游标,临时表创建
    List connected users–similar to task manager
    游戏视频编辑
    游戏音频编辑
    UE4 AI BehaviorTree 动画播放完成通知机制
    UE4 AI BehaviorTree 各个节点执行顺序总结
    Holographic Remoting
    Hololens 手势事件执行顺序
    Hololens 硬件细节 Hardware Detail
  • 原文地址:https://www.cnblogs.com/darkchii/p/7780640.html
Copyright © 2011-2022 走看看