用两个栈实现一个队列(C++实现)
用两个栈实现一个队列(C++实现):
首先我们先了解栈和队列的概念:
栈(FILO结构或LIFO结构):
定义:只能在栈的一端(栈顶)进行插入和删除操作的线性表。
逻辑结构:与线性表相同,仍为一对一关系。
存储结构:用顺序栈或链栈存储均可,但以顺序栈更常见。
运算规则:只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则。
实现方式:关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同。基本操作有入栈、出栈、读栈顶元素值、建栈、判断栈满、栈空等。
队列(FIFO结构):
定义:只能在表的一端(队尾)进行插入,在另一端(队头)进行删除运算的线性表。
逻辑结构:与线性表相同,仍为一对一关系。
存储结构:用顺序队列或链队存储均可。
运算规则:先进先出(FIFO)。
实现方式:关键是编写入队和出队函数,具体实现依顺序队或链队的不同而不同。
具体的实现:
注意:我的这里呢数据一直是存储在队列栈(m_stack1)中的
整体的结构:class m_queue
{
public:
int& back();//返回最后一个元素
bool empty();//判读队列是否为空
int& front();//返回第一个元素
void pop();//删除第一个元素
void push(int num);//在末尾加入一个元素
int size();//返回队列中元素的个数
m_queue();
~m_queue();
private:
int m_size=0;//记录元素个数
stack m_stack;//辅助栈(用于数据的翻转)
stack m_stack1;//队列栈(取出数据和队列的取出数据的顺序一样)
};
这里除了几个队列的函数我还写了一个自己的函数
size函数的实现:pop函数的实现:
front函数的实现:
back函数的实现:push函数的实现:
empty函数的实现:
代码(个人代码仅供参考):
bool m_queue::empty(){//用元素个数去判断是否为空(空为真)
if (m_size == 0){//如果元素个数为0则队列为空
return true;
}
return false;
}
//把m_stack3里的元素放到m_stack2(实现数据的翻转)
void Stackcopy(stack& m_stack2,stack& m_stack3){
//目的栈为m_stack2
while (!m_stack3.empty())
{
m_stack2.push(m_stack3.top());//将元素放到到另外一个栈中
m_stack3.pop();//删除栈顶元素
}
}
void m_queue::push(int num){//在末尾添加一个元素
m_size++;//元素个数加一
Stackcopy(m_stack,m_stack1);//先把m_stack1数据翻转到m_stack
m_stack1.push(num);//把元素添加到m_stack
Stackcopy(m_stack1, m_stack);//然后再次翻转
}
int& m_queue:: back(){//返回最后一个元素
Stackcopy(m_stack, m_stack1);//翻转元素
int num = m_stack.top();//用一个临时数据进行保存最后一个元素
Stackcopy(m_stack1, m_stack);//再次翻转
return num;//返回临时数据
}
int& m_queue::front(){
return m_stack1.top();//直接返回队列栈里的第一个元素
}
void m_queue::pop(){//删除队头元素
m_stack1.pop();//直接删除队列栈的元素
–m_size;//元素个数减一
}
int m_queue::size(){//返回队列中元素的个数
return m_size;//直接返回m_size;
}