两个队列实现一个栈

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个队列实现一个栈相关的知识,希望对你有一定的参考价值。

  (⊙﹏⊙)...第一次写比较偏C++风格的代码,因为已经决定开始进入C++的学习了,于是用这篇作为一个入门的机会,于是看了一小部分《C++ Primer Plus》,很抱歉的说,因为自从学过基础语法后感觉很难再去认真看其他语言的基础语法,还好的是C++很强大并且兼容了C,于是我就只看了C++中用new分配内存和delete释放内存、一点结构和一点C++的类等等小部分,而且看得还很不仔细,我觉得这样很不好,但因为比较想尽快能写一个比较像C++的东西,于是,就东查查,西查查的写了这么一个段小程序(比如C++没有getch()函数,而且我用的eclipse还不能用getch()函数,不知道为什么),这篇以后,我打算系统的学习C++。以后的代码片段可能就基本转变为C/C++类型的混合了...唔...因为我第一次写比较偏C++风的程序,而且,C++比较复杂,如果有格式上不正确或者程序哪里有不安全的地方等还希望能得到指点,谢谢!

  进入主题吧,两个队列实现一个栈,写了两个栈实现一个队列后,基本上思路是比较清晰的...但我发现比写两个栈实现一个队列要稍微难一点点,因为,这个程序是队列实现栈,貌似就不能用O(1)时间的实现出栈(抱歉,我没查过...不确定),我自己想的是最简单的,就是每次出栈,数据存放的队列就会换到另一个,进栈倒是不复杂,只用找到一个不是空的队列就好了。

  但是我的队列可能有些伪...

  code:

/*
 * index.cpp
 *
 *  Created on: 2017年10月29日
 *      Author: darkchii
 */

#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,就这样吧,学习学习!

以上是关于两个队列实现一个栈的主要内容,如果未能解决你的问题,请参考以下文章

两个栈实现一个队列

用两个栈实现队列-剑指Offer

用两个栈实现一个队列

用两个栈实现一个队列(C++)

剑指offer-用两个栈实现队列

剑指offer用两个栈实现队列