太原理工大学2025数据结构-栈和队列

第1关:用一维数组模拟双栈

cpp 复制代码
#include <iostream>
using namespace std;

#define MAXSIZE 10  // 双栈共享数组的最大容量

// 双栈结构体定义
// 特点:两个栈共享一个数组空间,栈底分别在数组两端
typedef struct {
    int* stack;      // 指向共享数组的指针
    int top[2];      // top[0]管理0号栈(栈底在数组左端),top[1]管理1号栈(栈底在数组右端)
} DualStack;

// 入栈函数
// 参数: S - 双栈结构体引用, i - 栈号(0或1), x - 要入栈的元素
void push(DualStack &S, int i, int x) {
    if (i != 0 && i != 1) return; // 检查栈号是否合法,非法则直接返回
    
    // 栈满判断:当两个栈的栈顶指针相邻时,表示数组空间已满
    if (S.top[0] + 1 == S.top[1]) {
        cout << "栈满" << endl;
        return;
    }
    
    if (i == 0) { // 向0号栈入栈
        S.top[0]++;                // 0号栈栈顶指针上移
        S.stack[S.top[0]] = x;     // 将元素放入新的栈顶位置
    } else {      // 向1号栈入栈
        S.top[1]--;                // 1号栈栈顶指针下移
        S.stack[S.top[1]] = x;     // 将元素放入新的栈顶位置
    }
}

// 出栈函数
// 参数: S - 双栈结构体引用, i - 栈号(0或1)
// 返回: 出栈的元素值,若栈空则返回-1
int pop(DualStack &S, int i) {
    if (i != 0 && i != 1) return -1; // 检查栈号是否合法,非法则返回-1
    
    if (i == 0) { // 从0号栈出栈
        if (S.top[0] == -1) {       // 检查0号栈是否为空
            cout << "0栈空" << endl;
            return -1;
        }
        int val = S.stack[S.top[0]]; // 取出栈顶元素
        S.top[0]--;                  // 栈顶指针下移
        return val;
    } else {      // 从1号栈出栈
        if (S.top[1] == MAXSIZE) {   // 检查1号栈是否为空
            cout << "1栈空" << endl;
            return -1;
        }
        int val = S.stack[S.top[1]]; // 取出栈顶元素
        S.top[1]++;                  // 栈顶指针上移
        return val;
    }
}

第2关:括号匹配

cpp 复制代码
#include <iostream>
#include <cstdlib>
#include <stack>
using namespace std;

// 函数功能:验证一个字符串中的括号是否完全匹配
// 参数:str - 指向待验证的字符串的指针
// 返回值:如果括号完全匹配,返回1;否则返回0
int isValid(char * str)
{
    stack<char> st; // 定义一个字符栈,用于存储遇到的左括号。
                    // 利用栈"后进先出"的特性,确保最后遇到的左括号最先被匹配。

    char* p = str;  // 使用指针p来遍历字符串str,初始指向字符串的第一个字符。
            
    while (*p != '\0') { // 循环遍历字符串,直到遇到字符串结束符'\0'为止。
        if (*p == '(' || *p == '{' || *p == '[') {
            // 如果当前字符是左括号('('、'{'或'[')
            st.push(*p); // 将其压入栈中,等待后续的右括号来匹配。
        } else {
            // 如果当前字符是右括号(或其他字符)
            
            // 1. 检查栈是否为空。
            // 如果栈为空,说明当前右括号没有对应的左括号与之匹配,字符串无效。
            if (st.empty()) return 0;

            // 2. 栈不为空,弹出栈顶的左括号。
            char top = st.top(); // 获取栈顶元素(最近的一个左括号)
            st.pop();            // 将栈顶元素弹出

            // 3. 判断弹出的左括号与当前的右括号是否是同一类型。
            // 如果不是同一类型(例如,左括号是'(', 右括号是'}'),则匹配失败。
            if ((top == '(' && *p != ')') || 
                (top == '{' && *p != '}') || 
                (top == '[' && *p != ']')) {
                return 0; // 括号类型不匹配,返回0表示无效。
            }
        }
        p++; // 指针p向后移动,准备处理下一个字符。
    }

    // 4. 遍历完整个字符串后,进行最后检查。
    // 如果栈为空,说明所有的左括号都找到了对应的右括号并被匹配。
    // 如果栈不为空,说明还有未被匹配的左括号残留,字符串无效。
    return st.empty() ? 1 : 0;
}

第3关:递归求叠数

cpp 复制代码
#include <iostream>
#include <cstdlib>
#include <stack>
using namespace std;

long long Redup(int n, int d)
{
    //在此处写入代码
    //返回叠数
    long long ret=0;
    while(n--)
    {
        ret=ret*10+d;
    }
    return ret;
}

第4关:找出游戏的获胜者

cpp 复制代码
#include <iostream>
#include <cstdlib>
#include <queue>
using namespace std;

int findTheWinner(int n, int k)
{
    //在此处写入代码
    //返回获胜者序号
   vector<bool>v(n,false);
   int sum=n;
   int cnt=0;int i=0;
   while(sum!=1)
   {
       while(v[i]==true)
       {
           if(i==n-1)i=0;
           else
           {
               i++;
           }
       }
       cnt++;
       if(cnt==k){v[i]=true;sum--;cnt=0;}
       if(i==n-1)i=0;
       else i++;
   }
for(int i=0;i<n;i++)
{
    if(v[i]==false)return i+1;
}
}
相关推荐
埃伊蟹黄面几秒前
字符串算法精要与例题汇编
c++·算法·leetcode·字符串
lxh01131 分钟前
最长公共子序列
前端·数据结构
Roye_ack4 分钟前
【leetcode hot 100】刷题记录与总结笔记(4/100)
笔记·算法·leetcode
..过云雨11 分钟前
15-2.【Linux系统编程】进程信号 - 信号保存(信号处理流程的三种状态:未决、阻塞、递达,信号保存由未决表完成、sigset_t信号集类型及相关函数)
linux·c++·后端·信号处理
黑牛先生14 分钟前
【GDB】调试Jsoncpp源码
开发语言·c++·算法
ibuki_fuko14 分钟前
QT/C++ 程序启动时检查程序是否已经启动
开发语言·c++·qt
XiaoHu020729 分钟前
C++特殊类设计与类型转换
开发语言·c++
大大大大物~31 分钟前
JVM 之 垃圾回收算法及其内部实现原理【垃圾回收的核心问题有哪些?分别怎么解决的?可达性分析解决了什么问题?回收算法有哪些?内部怎么实现的?】
jvm·算法
报错小能手38 分钟前
STL——set
开发语言·c++
不夜牛仔39 分钟前
算法笔记19 - 图和通用结构 | 图的两种遍历 | 三种拓扑排序 | 两种最小生成树算法Kruskal, Prim | 最短路径算法Dijkstra
笔记·算法