您的位置:首页 > 编程语言 > C语言/C++

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

2016-03-08 15:42 459 查看
仅仅是记录一下自己学习过程,实现方法效率可能比较低,但是能实现功能。

基本思路:

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: