队列定义:
template <typename DataType>
class Queue{
private:
int count;
int maxSize;
int front;
int rear;
DataType* elements;
public:
Queue(int size)
{
maxSize = size;
front = 0;
rear = 0;
count = 0;
elements = new DataType[size];
if(elements == NULL)
exit(1);
}
~Queue()
{
delete[] elements;
}
bool insert(DataType);
DataType delElement();
};
基本操作
template <typename DataType>
bool Queue<DataType>::insert(DataType)
{
if(count == maxSize)
{
return false;
}
elements[rear] = DataType;
rear = (rear+1)%maxSize;
count++;
return true;
}
template <typename DataType>
DataType Queue<DataType>::delElement()
{
if(count == 0)
return false;
DataType temp = elements[front];
front = (front+1)%maxSize;
count--;
return temp;
}
请设计程序实现利用栈实现队列。(思路是创建两个栈)
#include <iostream>
using namespace std;
template <typename DataType>
class Stack{
private:
int maxSize;
int top;
DataType* elements;
public:
Stack(int size)
{
top = -1;
maxSize = size;
elements = new DataType[size];
}
~Stack()
{
delete[] elements;
}
bool push(DataType data);
DataType pop();
bool isEmpty();
int eleNumber();
};
template <typename DataType>
bool push(DataType data)
{
if(top == maxSize-1)
return false;
elements[++top] = data;
return true;
}
template <typename DataType>
DataType Stack<DataType>::pop()
{
if(top == -1)
{
exit(1);
}
return elements[top--];
}
template <typename DataType>
bool Stack<DataType>::isEmpty()
{
if(top == -1)
return true;
else
return false;
}
template <typename DataType>
int Stack<DataType>::eleNumber()
{
return top+1;
}
template <typename DataType>
class QueueFromStack{
private:
Stack<DataType> *s1;
Stack<DataType> *s2;
int maxSize;
public:
QueueFromStack(int size)
{
maxSize = size;
s1 = new Stack<DataType>(size);
s2 = new Stack<DataType>(size);
}
~QueueFromStack()
{
s1->~Stack();
s2->~Stack();
}
bool push(DataType data);
DataType pop();
};
template <typename DataType>
bool QueueFromStack<DataType>::push(DataType data)
{
if(s2->isEmpty()||s1->eleNumber()< maxSize-s2->eleNumber())
return s1->push(data);
else
{
cout<<"error:the queue is full.\n"<<endl;
return false;
}
}
template <typename DataType>
DataType QueueFromStack<DataType>::pop()
{
if(s1->isEmpty()&&s2->isEmpty())
{
cout<<"error: the queue is empty.\n"<<endl;
exit(1);
}else if(s2->isEmpty())
{
while(!s1->isEmpty())
{
s2->push(s1->pop())
}
return s2->pop();
}else
{
return s2->pop();
}
}