C++ Tutorial/queue stack/queue — различия между версиями
Admin (обсуждение | вклад) м (1 версия: Импорт контента...) |
Admin (обсуждение | вклад) м (1 версия: Импорт контента...) |
(нет различий)
|
Текущая версия на 10:30, 25 мая 2010
Содержание
A queue for strings: push, empty, front, pop
#include <iostream>
#include <string>
#include <queue>
#include <stack>
using namespace std;
int main()
{
queue<string> q;
cout << "Pushing one two three four\n";
q.push("one");
q.push("two");
q.push("three");
q.push("four");
cout << "Now, retrieve those values in FIFO order.\n";
while(!q.empty()) {
cout << "Popping ";
cout << q.front() << "\n";
q.pop();
}
cout << endl;
return 0;
}
Instantiating an STL Queue
#include <queue>
#include <list>
int main ()
{
using namespace std;
// A queue of integers
queue <int> qIntegers;
// A queue of doubles
queue <double> qDoubles;
// A queue of doubles stored internally in a list
queue <double, list <double> > qDoublesInList;
return 0;
}
Queue buffer
#include <queue>
#include <stdexcept>
#include <iostream>
using namespace std;
using std::queue;
template <typename T>
class PacketBuffer{
public:
PacketBuffer(int maxSize = -1);
void bufferPacket(const T& packet);
T getNextPacket() throw (std::out_of_range);
protected:
queue<T> mPackets;
int mMaxSize;
private:
PacketBuffer(const PacketBuffer& src);
PacketBuffer& operator=(const PacketBuffer& rhs);
};
template <typename T>
PacketBuffer<T>::PacketBuffer(int maxSize)
{
mMaxSize = maxSize;
}
template <typename T>
void PacketBuffer<T>::bufferPacket(const T& packet)
{
if (mMaxSize > 0 && mPackets.size() == static_cast<size_t>(mMaxSize)) {
return;
}
mPackets.push(packet);
}
template <typename T>
T PacketBuffer<T>::getNextPacket() throw (std::out_of_range)
{
if (mPackets.empty()) {
throw (std::out_of_range("Buffer is empty"));
}
// retrieve the head element
T temp = mPackets.front();
// pop the head element
mPackets.pop();
// return the head element
return (temp);
}
class IPPacket {};
int main(int argc, char** argv)
{
PacketBuffer<IPPacket> ipPackets(3);
ipPackets.bufferPacket(IPPacket());
ipPackets.bufferPacket(IPPacket());
ipPackets.bufferPacket(IPPacket());
ipPackets.bufferPacket(IPPacket());
while (true) {
try {
IPPacket packet = ipPackets.getNextPacket();
} catch (out_of_range&) {
cout << "Processed all packets!" << endl;
break;
}
}
return (0);
}
queue.front()
#include <iostream>
using std::cout;
using std::endl;
#include <queue>
int main()
{
std::queue< double > values;
values.push( 3.2 );
values.push( 9.8 );
values.push( 5.4 );
cout << "Popping from values: ";
while ( !values.empty() )
{
cout << values.front() << " ";
values.pop();
}
cout << endl;
return 0;
}
Popping from values: 3.2 9.8 5.4
Queue: push, pop and size
#include <iostream>
#include <queue>
#include <list>
using namespace std;
int main()
{
int thedata[] = {45, 34, 56, 27, 71, 50, 62};
queue<int, list<int> > q;
cout << "The queue size is now " << q.size() << endl;
cout << "Pushing 4 elements " << endl;
for (int i = 0; i < 4; ++i)
q.push(thedata[i]);
cout << "The queue size is now " << q.size() << endl;
cout << "Popping 3 elements " << endl;
for (int i = 0; i < 3; ++i) {
cout << q.front() << endl;
q.pop();
}
cout << "The queue size is now " << q.size() << endl;
return 0;
}
The queue size is now 0 Pushing 4 elements The queue size is now 4 Popping 3 elements 45 34 56 The queue size is now 1
queue: push, pop, front and size
/* The following code example is taken from the book
* "The C++ Standard Library - A Tutorial and Reference"
* by Nicolai M. Josuttis, Addison-Wesley, 1999
*
* (C) Copyright Nicolai M. Josuttis 1999.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
#include <iostream>
#include <queue>
#include <string>
using namespace std;
int main()
{
queue<string> q;
// insert three elements into the queue
q.push("These ");
q.push("are ");
q.push("more than ");
// read and print two elements from the queue
cout << q.front();
q.pop();
cout << q.front();
q.pop();
// insert two new elements
q.push("four ");
q.push("words!");
// skip one element
q.pop();
// read and print two elements
cout << q.front();
q.pop();
cout << q.front() << endl;
q.pop();
// print number of elements in the queue
cout << "number of elements in the queue: " << q.size()
<< endl;
}
These are four words! number of elements in the queue: 0
queue with doubles
#include <iostream>
using std::cout;
using std::endl;
#include <queue>
int main()
{
std::queue< double > values;
values.push( 3.2 );
values.push( 9.8 );
values.push( 5.4 );
cout << "Popping from values: ";
while ( !values.empty() )
{
cout << values.front() << " ";
values.pop();
}
cout << endl;
return 0;
}
Popping from values: 3.2 9.8 5.4
Using a queue to store user-defined object
#include <iostream>
#include <queue>
#include <string>
using namespace std;
template <class T>
void print(T& c){
for( typename T::iterator i = c.begin(); i != c.end(); i++ ){
std::cout << *i << endl;
}
}
class Vehicle{
public:
Vehicle( string description = "Unknown car",string license = "Unknown license", bool wax = false );
string description() const;
string license() const;
bool wax() const;
private:
string description_, license_;
bool wax_;
};
inline
Vehicle::Vehicle( string description, string license, bool wax )
: description_( description ), license_( license ), wax_( wax )
{} // empty
string Vehicle::description() const
{ return description_; }
string Vehicle::license() const
{ return license_; }
bool Vehicle::wax() const
{ return wax_; }
int main( )
{
const char* description[] = { "A", "B","C", "D","E" };
const char* license[] = { "a", "b", "c","d", "e" };
const bool wax[] = { false, true, false, true, false };
const int num_cars = sizeof( wax ) / sizeof( wax[0] );
queue<Vehicle> line;
int count = 0;
while( count < num_cars || !line.empty() )
{
for( int i = 0; i < 2; ++i )
if( count < num_cars )
{
cout << "A " << description[count] << ", license " << license[count] << ", is here for a wash";
if( wax[count] )
cout << " and a wax";
cout << endl << endl;
line.push( Vehicle( description[count], license[count],wax[count] ) );
++count;
}
else
break;
cout << "ATTENTION PLEASE: a " << line.front().description()
<< ", license " << line.front().license()
<< ",\n\has been carefully washed ";
if( line.front().wax() )
cout << "and waxed ";
cout << "and is available for pick-up\n\n";
line.pop();
}
}
Working with a Queue of Integers
#include <queue>
#include <iostream>
int main (){
using namespace std;
// A queue of integers
queue <int> qIntegers;
cout << "Inserting {10, 5, -1, 20} into the queue" << endl;
// elements pushed into the queue are inserted at the end
qIntegers.push (10);
qIntegers.push (5);
qIntegers.push (-1);
qIntegers.push (20);
// the elements in the queue now are {20, -1, 5, 10} in that order
cout << "The queue contains " << qIntegers.size ();
cout << " elements" << endl;
cout << "Element at the front: " << qIntegers.front() << endl;
cout << "Element at the back: " << qIntegers.back ();
cout << endl << endl;
cout << "Removing them one after another..." << endl;
while (qIntegers.size () != 0)
{
cout << "Deleting element " << qIntegers.front () << endl;
// Remove the element at the front of the queue
qIntegers.pop ();
}
cout << endl;
// Test if the queue is empty
if (qIntegers.empty ())
cout << "The queue is now empty!";
return 0;
}