两个队列实现一个栈,写了两个栈实现一个队列后,基本上思路是比较清晰的...但我发现貌似就不能用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,就这样吧。