太原理工大学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;
}
}
相关推荐
仰泳的熊猫7 分钟前
题目1433:蓝桥杯2013年第四届真题-危险系数
数据结构·c++·算法·蓝桥杯·深度优先·图论
平哥努力学习ing8 分钟前
补充 part 1——防御性编程
算法
cyforkk9 分钟前
14、Java 基础硬核复习:数据结构与集合源码的核心逻辑与面试考点
java·数据结构·面试
Trouvaille ~17 分钟前
【Linux】线程同步与互斥(四):线程池与任务管理
linux·运维·服务器·c++·操作系统·线程池·日志系统
wbs_scy19 分钟前
C++:智能指针完全指南(原理、用法与避坑实战,从 RAII 到循环引用)
开发语言·c++·算法
u01092727121 分钟前
C++中的对象池模式
开发语言·c++·算法
试试勇气23 分钟前
算法工具箱之哈希表
数据结构·算法·散列表
HaiLang_IT24 分钟前
【信息安全毕业设计】基于双层滤波与分割点改进孤立森林的网络入侵检测算法研究
网络·算法·课程设计
hansang_IR43 分钟前
【记录】AT_abc400模拟赛
c++·算法·模拟赛
iAkuya1 小时前
(leetcode)力扣100 59括号生成(回溯||按括号序列的长度递归)
算法·leetcode·职场和发展