顺序队列、约瑟夫环
实现代码:
#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
链式队列
实现代码:
#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:赵六