太原理工大学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;
}
}
相关推荐
不想写代码的星星2 小时前
虚函数表:C++ 多态背后的那个男人
c++
Gorway2 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风2 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect2 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript
灵感__idea16 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect1 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP2 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
端平入洛2 天前
delete又未完全delete
c++
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉