Word文档(栈)

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

posted @ 2024-09-19 17:00  yesno233233  阅读(28)  评论(0)    收藏  举报