exp1_code

#include <iostream>

using namespace std;

// 链栈节点结构

struct StackNode {

int data;

StackNode* next;

StackNode(int val) : data(val), next(nullptr) {}

};

// 顺序栈实现

class SeqStack {

private:

int* data;

int top;

int capacity;

public:

SeqStack(int size = 10) : capacity(size), top(-1) {

data = new int[capacity];

}

~SeqStack() {

delete[] data;

}

bool isEmpty() const {

return top == -1;

}

bool isFull() const {

return top == capacity - 1;

}

bool push(int val) {

if (isFull()) return false;

data[++top] = val;

return true;

}

bool pop(int& val) {

if (isEmpty()) return false;

val = data[top--];

return true;

}

bool getTop(int& val) const {

if (isEmpty()) return false;

val = data[top];

return true;

}

};

// 链栈实现

class LinkStack {

private:

StackNode* topNode;

public:

LinkStack() : topNode(nullptr) {}

~LinkStack() {

while (topNode) {

StackNode* temp = topNode;

topNode = topNode->next;

delete temp;

}

}

bool isEmpty() const {

return topNode == nullptr;

}

void push(int val) {

StackNode* newNode = new StackNode(val);

newNode->next = topNode;

topNode = newNode;

}

bool pop(int& val) {

if (isEmpty()) return false;

val = topNode->data;

StackNode* temp = topNode;

topNode = topNode->next;

delete temp;

return true;

}

bool getTop(int& val) const {

if (isEmpty()) return false;

val = topNode->data;

return true;

}

};

// 循环队列实现

class CirQueue {

private:

int* data;

int front;

int rear;

int capacity;

public:

CirQueue(int size) : capacity(size + 1), front(0), rear(0) {

data = new int[capacity];

}

~CirQueue() {

delete[] data;

}

bool isEmpty() const {

return front == rear;

}

bool isFull() const {

return (rear + 1) % capacity == front;

}

bool enQueue(int val) {

if (isFull()) return false;

data[rear] = val;

rear = (rear + 1) % capacity;

return true;

}

bool deQueue(int& val) {

if (isEmpty()) return false;

val = data[front];

front = (front + 1) % capacity;

return true;

}

int getLength() const {

return (rear - front + capacity) % capacity;

}

};

// 测试栈功能

void testStacks() {

cout << "测试顺序栈:" << endl;

SeqStack seqStack(5);

for (int i = 1; i <= 5; i++) {

seqStack.push(i);

}

int val;

while (seqStack.pop(val)) {

cout << val << " ";

}

cout << endl;

cout << "测试链栈:" << endl;

LinkStack linkStack;

for (int i = 1; i <= 5; i++) {

linkStack.push(i);

}

while (linkStack.pop(val)) {

cout << val << " ";

}

cout << endl;

}

// 解决约瑟夫环问题(仅输出安全位置)

void solveJosephus() {

const int n = 41; // 总人数

const int m = 3; // 报数间隔

const int survivors = 2; // 最后存活人数

CirQueue queue(n);

for (int i = 1; i <= n; i++) {

queue.enQueue(i);

}

int count = 0;

int out;

// 淘汰过程,直到剩下survivors个人

while (queue.getLength() > survivors) {

queue.deQueue(out);

count++;

if (count % m == 0) {

// 移除淘汰顺序输出

} else {

queue.enQueue(out);

}

}

// 输出最后存活的位置

cout << "约瑟夫和他的朋友选择的安全位置是:" << endl;

while (!queue.isEmpty()) {

queue.deQueue(out);

cout << out << " ";

}

cout << endl;

}

int main() {

// 测试栈实现

testStacks();

// 解决约瑟夫环问题

solveJosephus();

return 0;

}

相关推荐
机器学习之心1 小时前
多目标鲸鱼优化算法(NSWOA),含46种测试函数和9个评价指标,MATLAB实现
算法·matlab·多目标鲸鱼优化算法·46种测试函数·9个评价指标
max5006002 小时前
基于Meta Llama的二语习得学习者行为预测计算模型
人工智能·算法·机器学习·分类·数据挖掘·llama
王哥儿聊AI3 小时前
Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量
人工智能·算法·安全·机器学习·音视频·软件工程
手握风云-5 小时前
优选算法的寻踪契合:字符串专题
算法
闭着眼睛学算法5 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
IT古董5 小时前
【第五章:计算机视觉-项目实战之目标检测实战】2.目标检测实战:中国交通标志检测-(2)中国交通标志检测数据格式转化与读取
算法·目标检测·计算机视觉
MobotStone5 小时前
LLM 采样入门到进阶:理解与实践 Top-K、Top-P、温度控制
算法
杨小码不BUG6 小时前
CSP-J/S初赛知识点精讲-图论
c++·算法·图论··编码·csp-j/s初赛
LeaderSheepH7 小时前
常见的排序算法
数据结构·算法·排序算法
周杰伦_Jay8 小时前
【图文详解】强化学习核心框架、数学基础、分类、应用场景
人工智能·科技·算法·机器学习·计算机视觉·分类·数据挖掘