第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;
}
}