数据结构——顺序队列,链式队列,约瑟夫环(C++实现)

顺序队列、约瑟夫环

实现代码:

/*************************************************************************
	> File Name: seqQueue.cpp
	> Author: 念念
	> Mail: 2845906049@qq.com 
	> Created Time: 2021年08月19日 星期四 14时19分01秒
    > Function: 队列实现(顺序存储,循环队列,实现约瑟夫环)
 ************************************************************************/

#include <iostream>
#include <iomanip>
using namespace std;

#define MAXSIZE 30

class Queue
{
public:
    void push(int value);
    int pop();
    void print();
    bool isEmpty(){return size == 0 ? true : false;}
    int getSize(){return size;}
private:
    int queue[MAXSIZE];
    int front = 0;
    int rear = -1;
    int size = 0;
};

void Queue::push(int value)
{
    if(size >= MAXSIZE)
    {
        cout << "队列已满!\n";
        return;
    }
    rear = ++rear % MAXSIZE;
    queue[rear] = value;
    size++;
}

int Queue::pop()
{
    if(size == 0)
    {
        cout << "队列为空!\n";
        return 0;
    }
    int temp = queue[front];
    front = ++front % MAXSIZE;
    size--;
    return temp;
}


void Queue::print()
{
    if(size == 0)
    {
        cout << "队列为空!";
        return;
    }
    int temp = front;
    for(int i = 0; i < size; i++)
    {
        cout << setw(2) << queue[temp++ % MAXSIZE] << " ";
    }
    cout << endl;
}

void Joseph()
{
    Queue q;
    int num; //设置总人数
    int count = 0;

    cout << "输入人数(不超过" << MAXSIZE << "):";
    cin >> num;
    
    for(int i = 1; i <= num; i++)
    {
        q.push(i);
    }
    while(q.getSize() != 1)
    {       
        int temp = q.pop();
        count++;
        if(count % 3 == 0)
        {
            cout << "kill:" << setw(2) << temp << "  ,剩余:";
            q.print();
        }
        else
        {
            q.push(temp);
        }
    }
}

int main()
{
#if 0
    Queue q;
    for(int i = 0; i < 11; i++)
    {
        q.push(i);
    }
    q.print();
    cout << q.pop() << endl;
    q.print();
#endif
    Joseph();

    return 0;
}

运行结果:

输入人数(不超过30):30
kill: 3  ,剩余: 4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  1  2 
kill: 6  ,剩余: 7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  1  2  4  5
kill: 9  ,剩余:10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  1  2  4  5  7  8
kill:12  ,剩余:13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  1  2  4  5  7  8 10 11
kill:15  ,剩余:16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  1  2  4  5  7  8 10 11 13 14
kill:18  ,剩余:19 20 21 22 23 24 25 26 27 28 29 30  1  2  4  5  7  8 10 11 13 14 16 17
kill:21  ,剩余:22 23 24 25 26 27 28 29 30  1  2  4  5  7  8 10 11 13 14 16 17 19 20
kill:24  ,剩余:25 26 27 28 29 30  1  2  4  5  7  8 10 11 13 14 16 17 19 20 22 23
kill:27  ,剩余:28 29 30  1  2  4  5  7  8 10 11 13 14 16 17 19 20 22 23 25 26
kill:30  ,剩余: 1  2  4  5  7  8 10 11 13 14 16 17 19 20 22 23 25 26 28 29
kill: 4  ,剩余: 5  7  8 10 11 13 14 16 17 19 20 22 23 25 26 28 29  1  2
kill: 8  ,剩余:10 11 13 14 16 17 19 20 22 23 25 26 28 29  1  2  5  7
kill:13  ,剩余:14 16 17 19 20 22 23 25 26 28 29  1  2  5  7 10 11
kill:17  ,剩余:19 20 22 23 25 26 28 29  1  2  5  7 10 11 14 16
kill:22  ,剩余:23 25 26 28 29  1  2  5  7 10 11 14 16 19 20
kill:26  ,剩余:28 29  1  2  5  7 10 11 14 16 19 20 23 25
kill: 1  ,剩余: 2  5  7 10 11 14 16 19 20 23 25 28 29
kill: 7  ,剩余:10 11 14 16 19 20 23 25 28 29  2  5
kill:14  ,剩余:16 19 20 23 25 28 29  2  5 10 11
kill:20  ,剩余:23 25 28 29  2  5 10 11 16 19
kill:28  ,剩余:29  2  5 10 11 16 19 23 25
kill: 5  ,剩余:10 11 16 19 23 25 29  2
kill:16  ,剩余:19 23 25 29  2 10 11
kill:25  ,剩余:29  2 10 11 19 23
kill:10  ,剩余:11 19 23 29  2
kill:23  ,剩余:29  2 11 19
kill:11  ,剩余:19 29  2
kill: 2  ,剩余:19 29
kill:19  ,剩余:29

链式队列

实现代码:

/*************************************************************************
	> File Name: linkQueue.cpp
	> Author: 念念
	> Mail: 2845906049@qq.com 
	> Created Time: 2021年08月19日 星期四 15时27分19秒
    > Function: 队列的实现(链式队列)
 ************************************************************************/
#include <iostream>
#include <string>
using namespace std;

struct Node
{
    int num;
    string name;
    Node * next;
};

class LinkQueue
{
public:
    LinkQueue();
    ~LinkQueue();
    Node *createNode(int num,string name);
    void push(Node *node);
    Node* pop();
    bool isEmpty();
    void print();
private:
    Node * rear;//队列尾
    Node * front;//队列头
    int size = 0;
};

LinkQueue::LinkQueue()
{
    front = new(Node);
    front->next = NULL;
    front->num = -1;
    front->name = "队头";
    rear = new(Node);
    rear->next = NULL;
    
}
LinkQueue::~LinkQueue()
{
    delete rear;
    delete front;
}
Node * LinkQueue::createNode(int num,string name)
{
    Node * node = new(Node);
    node->num = num;
    node->name = name;
    node->next = NULL;
    return node;
}
void LinkQueue::push(Node * node)
{
    if(size == 0)
    {
        rear->next = node;
        front->next = node;
        size++;
        return;
    }
    front->next->next = node;
    front->next = node;
    size++;
}
Node* LinkQueue::pop()
{
    if(isEmpty())
    {
        cout << "队列为空!";
        return front; //此处不返回空,防止因外界使用返回值的成员变量造成段错误
    }
    Node *p = rear->next;
    rear->next = rear->next->next;
    p->next = NULL; //将其置为空,防止在类外获取后续指针
    size--;
    return p;
}

bool LinkQueue::isEmpty()
{
    return size == 0 ? true : false;
}

void LinkQueue::print()
{
    if(isEmpty())
    {
        cout << "队列为空!\n";
        return ;
    }
    cout << "打印(按出队顺序):\n";
    Node * temp = rear->next;
    while(NULL != temp)
    {
        cout << "num:" << temp->num << "\tname:" << temp->name << endl;
        temp = temp->next;
    }
}
int main()
{
    LinkQueue lq;
    Node *temp;
    lq.print();
    lq.push(lq.createNode(1,"张三")); 
    lq.push(lq.createNode(2,"李四")); 
    lq.push(lq.createNode(3,"王五"));
    lq.push(lq.createNode(4,"赵六"));

    lq.print();
    temp = lq.pop();
    cout << "弹出:" << temp->num << temp->name << endl;
    temp = lq.pop();
    cout << "弹出:" << temp->num << temp->name << endl;
    lq.print();
    return 0;
}

运行结果:

队列为空!
打印(按出队顺序):
num:1	name:张三
num:2	name:李四
num:3	name:王五
num:4	name:赵六
弹出:1张三
弹出:2李四
打印(按出队顺序):
num:3	name:王五
num:4	name:赵六

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

念念⁡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值