当堆栈为空时抛出异常的问题…队列/堆栈实现



我需要抛出一个异常,当两个堆栈都是空的,但我不知道我应该怎么写。

我必须实现一个有两个堆栈的队列!

this is main

#include "QueueFromStacks.h"
int main()
{
/*  THIS IS JUST TO SHOW YOU HOW #include <stack> WORKS
stack<int> st1;
stack<int> st2;
cout << "Size before push:" << st2.size() << "n";
st2.push(2);
st2.push(5);
cout << "Size after two pushes:" << st2.size() << "n";
cout << st2.top() << "n";
st2.pop();
cout << "Size of st2 after one pop:" << st2.size() << "n";
st1.push(st2.top());
st2.pop();
cout << "Size of st1:" <<st1.size()<< "   Size of st2:"<< st2.size();
*/
QueueFromStacks<int> qfs;
qfs.QueueFromStacks();
qfs.enqueue(1);
qfs.enqueue(2);
qfs.enqueue(3);
qfs.dequeue();
cout  << "Queue Front : " << (qfs.front())<< endl;
// You have to implement QueuefromStack
// The logic of the queue remains the same(FIFO) but you have to use the two stacks to store your elements
// In the main program create a queuefromstack object and use your implemented methods to clearly show us what u did
return 0;
}

头文件

#ifndef QUEUEFROMSTACKS_H_
#define QUEUEFROMSTACKS_H_

#include <iostream>
#include <stack>
#include <string>

using namespace std;

class QueueEmptyException{
public:
QueueEmptyException();
~QueueEmptyException();

string getMessage() { return "Queue is empty"; }
};

template <typename E>
class QueueFromStacks
{
public:
QueueFromStacks();
~QueueFromStacks();

int size() const;
bool empty() const;
const E& front() const throw(QueueEmptyException);
void enqueue (const E& e);
void dequeue() throw(QueueEmptyException);
private:
stack<E> st1;
stack<E> st2;
int numElements;
};
#endif /* QUEUEFROMSTACKS_H_ */

实施

#include "QueueFromStacks.h"
template <typename E>
QueueFromStacks<E>::QueueFromStacks()
{
numElements = 0;
}
template <typename E>
QueueFromStacks<E>::~QueueFromStacks()
{
// TODO Auto-generated destructor stub
}
template <typename E>
int QueueFromStacks<E>::size() const
{
return numElements;
}
template <typename E>
bool  QueueFromStacks<E>::empty() const
{
return (size() == 0);
}
template <typename E>
const E& QueueFromStacks<E>::front() const
throw(QueueEmptyException)
{
return st2.top();  // don't forget to check for empty and throw exception if it is empty.
}
template <typename E>
void QueueFromStacks<E>::enqueue (const E& e)
{
st2.push(e);
numElements++;
}
template <typename E>
void QueueFromStacks<E>::dequeue()
throw(QueueEmptyException)
{
**// if both stacks are empty   // here i dont know what should i put as a throw condition  
if (st1.empty() && st2.empty()) 
{
throw;
}**
// if the second stack is empty, move elements from the first stack to it
if (st2.empty())
{
while (!st1.empty())
{
st2.push(st1.top());
st1.pop();
}
// or make a call to swap(s1, s2)
}
// return the top item from the second stack
int top = st2.top();
st2.pop();
numElements--;
}

你需要改变这个:

void QueueFromStacks<E>::enqueue (const E& e)
{
st2.push(e);
numElements++;
}

:

void QueueFromStacks<E>::enqueue (const E& e)
{
st1.push(e);
numElements++;
}

相关内容

  • 没有找到相关文章

最新更新