用两个栈实现一个队列(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;
}

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值