C++两个栈实现一个队列和两个队列实现一个栈


         今天用C++实现了下两个栈模拟一个队列和两个队列模拟一个栈!代码可能有很多漏洞,如果读者发现问题,

可以及时反馈,非常感谢!!!

        代码如下:

#include <iostream>
#include <stdlib.h>
#include <stack>
#include <queue>
using namespace std;

#if 1
//  *******两个栈实现一个队列********
typedef int ElemType;
typedef struct {
   stack<ElemType>s1;  //负责入队列
   stack<ElemType>s2;  //负责出队列
}SQueue;

//判断队列是否为空
bool IsEmpty(SQueue &q) {
   if ((q.s1.empty()) && (q.s2.empty())) {
      return true;
   }
   return false;
}

// 入队列
void EnQueue(SQueue &q, ElemType e) {
   q.s1.push(e);
}

//  队列大小
int GetQueueSize(SQueue &q) {
   return q.s1.size() + q.s2.size();
}

//出队列
void DeQueue(SQueue &q) {
   if (q.s2.empty()) {
      while (!q.s1.empty()) {
        q.s2.push(q.s1.top());
        q.s1.pop();
      }
   }
   if (!q.s2.empty()) {  //队空
       q.s2.pop();  //出队列
   }
}

//  取队首先元素
ElemType GetFront(SQueue &q) {
    if (q.s2.empty()) {
      while (!q.s1.empty()) {
        q.s2.push(q.s1.top());
        q.s1.pop();
      }
   }
   if (q.s2.empty()) {  //队空
      throw;
   }
   return q.s2.top();
}

int main() {
  SQueue sq;
  EnQueue(sq, 1);
  EnQueue(sq, 2);
  EnQueue(sq, 3);
  EnQueue(sq, 4);
  EnQueue(sq, 5);
  EnQueue(sq, 6);
  cout << GetFront(sq) << endl;
  DeQueue(sq);

  cout << GetFront(sq) << endl;
  DeQueue(sq);

  cout << GetFront(sq) << endl;
  DeQueue(sq);
  cout << GetFront(sq) << endl;
  cout << GetFront(sq) << endl;

  cout << GetQueueSize(sq) << endl;
  return 0;
}
#endif

#if 1
//  ****两个队列实现一个栈****
typedef int ElemType;
typedef struct {
   queue<ElemType>q1;  //入队
   queue<ElemType>q2;  //中转
}QStack;

// 栈是否为空
bool IsEmpty(QStack s) {
    if (s.q1.empty()) {
        return true;
    }
    return false;
}

// 栈大小
int GetStackSize(QStack s) {
   return s.q1.size();
}
//压栈
void Push(QStack &s, ElemType e) {
   s.q1.push(e);
}

//弹栈
void Pop(QStack &s) {
    if (!s.q1.empty()) {
       while (s.q1.size() != 1) {  //队列q1的n-1个元素移动到q2
         s.q2.push(s.q1.front());
         s.q1.pop();
       }
       s.q1.pop();
       while (!s.q2.empty()) {
         s.q1.push(s.q2.front());
         s.q2.pop();
       }
    }
}

//取栈顶元素
int Top(QStack &s) {
   if (s.q1.empty()) {
      throw;  //栈空
   }
   while (!s.q1.empty()) {  //队列q1的n个元素移动到q2
     s.q2.push(s.q1.front());
     s.q1.pop();
   }
   ElemType tmp = s.q2.back();  //获取第n个元素
   while (!s.q2.empty()) {
     s.q1.push(s.q2.front());
     s.q2.pop();
   }
   return tmp;
}

int main() {
    QStack qs;
    Push(qs, 1);
    Push(qs, 2);
    Push(qs, 3);
    Push(qs, 4);
    try {
        cout << Top(qs) << endl;
        Pop(qs);
        cout << Top(qs) << endl;
        Pop(qs);
        cout << Top(qs) << endl;
        Pop(qs);
        cout << Top(qs) << endl;
        Pop(qs);
        cout << "size:" << GetStackSize(qs) << endl;
    }  catch (...) {

    }
    if (IsEmpty(qs)) {
        cout << "栈空" << endl;
    } else {
       cout << "栈非空" << endl;
    }
   return 0;
}
#endif // 1


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值