C++ 使用2个栈实现队列的方法(可直接编译)

仅仅是记录一下自己学习过程,实现方法效率可能比较低,但是能实现功能。


基本思路:

1.  使用一个栈S来完成操作, 栈stemp只是一个临时的容器。

2. 入队时 判断栈S是不是满了,没满就加入;出队时判断栈S是不是空了, 没空的话, 将所有栈S中的数据压入临时栈stemp,然后从stemp中pop一个数据,最后将临时栈的所有元素全部压回栈S.


通过百度,发现优化的思路如下:

1.  栈S1用来入栈, 栈S2用来出栈;

2. 当需要出栈时,判断S2是否为空,不为空就直接pop一个元素,为空就将S1中所有元素全部压入S2,若S1也为空就提示出栈出错。

这种方法的效率比下面实现的要高一些,省去了将S2压回S1的操作,不过注意的是需要将S2中所有元素都pop之后才能push,不然就乱了。


文件一:queue.h

#include "stack.h"

class Queue{
private:
Stack s;
Stack stemp;
public:
Queue();
bool isempty() const;
bool isfull() const;
bool enqueue(const Item & item);
bool dequeue(Item & item);
};


文件二:queue.cpp


#include <iostream>
#include "queue_bystack.h"
using namespace std;


Queue::Queue()
{
cout << "Creat queue success.\n";
}


bool Queue::isempty() const
{
return s.isempty();
}


bool Queue::isfull() const
{
return s.isfull();
}


bool Queue::enqueue(const Item & item)
{
if(s.isfull())
{
return false;
}
s.push(item);
return true;
}


bool Queue::dequeue(Item & item)
{
Item temp;
if(s.isempty())
{
return false;
}
while(s.pop(temp))
{
stemp.push(temp);
}
stemp.pop(item);
while(stemp.pop(temp))
{
s.push(temp);
}
return true;
}


文件三:testqueue.cpp

#include <iostream>
#include "queue_bystack.h"
#include <cctype>

using namespace std;


int main()
{
Queue q;
char ch;
unsigned long lnum;

cout << "Enter 'E' to join queue, 'D' to leave queue, 'Q' to quit.\n";
while(cin >> ch && (toupper(ch) != 'Q'))
{
while(cin.get() != '\n')
continue;

switch(ch)
{
case 'E':
case 'e':
cout << "please input the number (long): ";
cin >> lnum;
cin.get();
if(!q.enqueue(lnum))
{
cout << "join queue failed, try 'E'.\n";
}
else 
{
cout << "---->" << lnum << endl;
}
break;
case 'D':
case 'd':
if(!q.dequeue(lnum))
{
cout << "dequeue failed, tyr 'E'.\n";
}
else
{
cout << "----->" << lnum << endl;
}
break;
case 'Q':
case 'q':
break;
}
cout << "Enter 'E' to join queue, 'D' to leave queue, 'Q' to quit.\n";
}
cout << "Bye.\n";
return 0;
}


文件四:stack.h

#ifndef __STACK_H_
#define __STACK_H_


typedef unsigned long Item;
class Stack{
private:
enum {MAX = 10};
int top;
Item item[MAX];
public:
Stack();
bool isempty() const;
bool isfull() const;
bool push(const Item & it);
bool pop(Item & it);
};


#endif


文件五:stack.cpp

#include "stack.h"
#include <iostream>
/*
private:
enum {MAX = 10};
int top;
Item item[MAX];
public:
Stack();
bool isempty() const;
bool isfull() const;
bool push(const Item & item);
bool pop(Item & item);
*/


using namespace std;
Stack::Stack()
{
top = 0;
cout << "creat stack success." << endl;
}


bool Stack::isempty() const
{
return top <= 0;
}


bool Stack::isfull() const
{
return top >= MAX;
}


bool Stack::push(const Item &it)
{
if(isfull())
{
return false;
}
item[top++] = it;
return true;
}


bool Stack::pop(Item &it)
{
if(isempty())
{
return false;
}
it = item[--top];
return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值