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;

}

相关推荐
qqxhb27 分钟前
零基础数据结构与算法——第七章:算法实践与工程应用-搜索引擎
算法·搜索引擎·tf-idf·倒排索引·pagerank·算法库
gzzeason1 小时前
LeetCode Hot100:递归穿透值传递问题
算法·leetcode·职场和发展
汤永红1 小时前
week1-[循环嵌套]画正方形
数据结构·c++·算法
pusue_the_sun1 小时前
数据结构——顺序表&&单链表oj详解
c语言·数据结构·算法·链表·顺序表
yi.Ist2 小时前
图论——Djikstra最短路
数据结构·学习·算法·图论·好难
数据爬坡ing2 小时前
过程设计工具深度解析-软件工程之详细设计(补充篇)
大数据·数据结构·算法·apache·软件工程·软件构建·设计语言
茜子.Java3 小时前
二分算法(模板)
算法
qq_513970444 小时前
力扣 hot100 Day74
数据结构·算法·leetcode
Cx330❀5 小时前
【数据结构初阶】--排序(三):冒泡排序、快速排序
c语言·数据结构·经验分享·算法·排序算法
效效超爱笑7 小时前
数据结构---链式结构二叉树
数据结构·算法