Word文档(栈)
#include <stdio.h>
#include <string.h>
#define MAX_OPS 10000 // 定义最大操作数
#define MAX_STR_LEN 31 // 定义最大字符串长度
// 栈相关操作
int topA = -1; // 栈A的栈顶指针,初始化为-1表示空栈
int topB = -1; // 栈B的栈顶指针,初始化为-1表示空栈
char stackA[MAX_OPS][MAX_STR_LEN]; // 栈A用于保存有效的输入操作
char stackB[MAX_OPS][MAX_STR_LEN]; // 栈B用于保存被撤销的操作
// 压栈操作(将字符串压入栈A)
void pushA(const char *str)
{
strcpy(stackA[++topA], str); // 将字符串复制到栈A并更新栈顶指针
}
// 压栈操作(将字符串压入栈B)
void pushB(const char *str)
{
strcpy(stackB[++topB], str); // 将字符串复制到栈B并更新栈顶指针
}
// 弹栈操作(从栈A弹出顶部元素并压入栈B)
void popA()
{
if (topA >= 0)
{ // 检查栈A是否为空
pushB(stackA[topA--]); // 将栈A顶部元素压入栈B并更新栈顶指针
}
}
// 弹栈操作(从栈B弹出顶部元素并压入栈A)
void popB()
{
if (topB >= 0)
{ // 检查栈B是否为空
pushA(stackB[topB--]); // 将栈B顶部元素压入栈A并更新栈顶指针
}
}
// 清空栈B(因为新输入操作时撤销栈B需要清空)
void clearB()
{
topB = -1; // 通过重置栈顶指针将栈B清空
}
int main()
{
int n; // 用于存储输入的操作次数
char operation[40]; // 用于存储操作指令("input", "ctrl+z", "ctrl+y")
char inputStr[MAX_STR_LEN]; // 用于存储输入的字符
// 输入操作次数
scanf("%d", &n);
// 循环处理每一个操作
for (int i = 0; i < n; i++)
{
scanf("%s", operation); // 输入操作类型(input 或者 ctrl+z, ctrl+y)
// 处理输入操作
if (strcmp(operation, "input") == 0)
{
// 如果是 "input" 操作,读取输入的字符串
scanf("%s", inputStr);
pushA(inputStr); // 将输入的字符压入栈A
clearB(); // 新输入后清空栈B,因为撤销记录不再有效
// 处理撤销操作
}
else if (strcmp(operation, "ctrl+z") == 0)
{
popA(); // 将栈A顶部元素撤销到栈B
// 处理恢复操作
}
else if (strcmp(operation, "ctrl+y") == 0)
{
popB(); // 将栈B顶部元素恢复到栈A
}
}
// 最后输出栈A中的内容
if (topA == -1)
{
// 如果栈A为空,输出 "No output"
printf("No output\n");
}
else
{
// 输出栈A中的每个字符,并在字符之间加空格
for (int i = 0; i <= topA; i++)
{
printf("%s", stackA[i]);
if (i != topA)
{
printf(" "); // 在每两个字符之间添加空格
}
}
printf("\n");
}
return 0;
}
标签:Word,压入,ctrl,int,MAX,栈顶,文档,操作
From: https://www.cnblogs.com/yesno233233/p/18420951