8587 行编辑程序

思路

  1. **初始化栈**:创建一个空栈用于存储有效字符。

  2. **读取输入**:读取输入的行数 `n`,然后逐行读取字符。

  3. **处理字符**:

  • 如果是 `#`,则弹出栈顶字符(如果栈不为空)。

  • 如果是 `@`,则清空栈。

  • 其他字符则入栈。

  1. **输出有效字符**:遍历栈并输出有效字符。

  2. **重置栈**:处理完一行后,清空栈以处理下一行。

伪代码

```

function InitStack(S):

allocate memory for S.base of size STACK_INIT_SIZE

S.top = S.base

S.stacksize = STACK_INIT_SIZE

return OK

function StackEmpty(S):

return S.top == S.base

function ClearStack(S):

S.top = S.base

return OK

function DestroyStack(S):

free memory of S.base

S.base = NULL

S.top = NULL

S.stacksize = 0

return OK

function Push(S, e):

if S.top - S.base >= S.stacksize:

reallocate memory for S.base with size S.stacksize + STACKINCREMENT

S.top = S.base + S.stacksize

S.stacksize += STACKINCREMENT

S.top = e

S.top += 1

return OK

function Pop(S, e):

if S.top == S.base:

return ERROR

S.top -= 1

e = S.top

return OK

function StackTraverse(S, visit):

while S.top > S.base:

visit(*S.base++)

print newline

return OK

function visit(c):

print c

return OK

function LineEdit():

initialize stack s

read integer n

for i from 1 to n:

read character ch

while ch is not newline:

if ch is '#':

Pop(s, c)

else if ch is '@':

ClearStack(s)

else:

Push(s, ch)

read next character ch

StackTraverse(s, visit)

ClearStack(s)

DestroyStack(s)

function main():

LineEdit()

```

C++代码

cpp 复制代码
#include <iostream>
#include <cstdlib>
using namespace std;

typedef char SElemType;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2

struct SqStack {
    SElemType *base;
    SElemType *top;
    int stacksize;
};

Status InitStack(SqStack &S) {
    S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if (!S.base) exit(ERROR);
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}

Status StackEmpty(SqStack S) {
    return S.top == S.base ? TRUE : FALSE;
}

Status ClearStack(SqStack &S) {
    S.top = S.base;
    return OK;
}

Status DestroyStack(SqStack &S) {
    free(S.base);
    S.base = NULL;
    S.top = NULL;
    S.stacksize = 0;
    return OK;
}

Status Push(SqStack &S, SElemType e) {
    if (S.top - S.base >= S.stacksize) {
        S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
        if (!S.base) exit(ERROR);
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top++ = e;
    return OK;
}

Status Pop(SqStack &S, SElemType &e) {
    if (S.top == S.base) return ERROR;
    e = *--S.top;
    return OK;
}

Status StackTraverse(SqStack S, Status(*visit)(SElemType)) {
    while (S.top > S.base) {
        visit(*S.base++);
    }
    printf("\n");
    return OK;
}

Status visit(SElemType c) {
    printf("%c", c);
    return OK;
}

void LineEdit() {
    SqStack s;
    char ch, c;
    int n, i;
    InitStack(s);
    cin >> n;
    ch = getchar(); // consume newline after integer input
    for (i = 1; i <= n; i++) {
        ch = getchar();
        while (ch != '\n') {
            switch (ch) {
                case '#':
                    Pop(s, c);
                    break;
                case '@':
                    ClearStack(s);
                    break;
                default:
                    Push(s, ch);
                    break;
            }
            ch = getchar();
        }
        StackTraverse(s, visit);
        ClearStack(s);
    }
    DestroyStack(s);
}

int main() {
    LineEdit();
    return 0;
}
相关推荐
醉城夜风~5 分钟前
[数据结构]堆详解
开发语言·数据结构
苏言の狗11 分钟前
小R的并集大小期望计算 | 蛮力
数据结构·算法
BineHello17 分钟前
MPC用优化求解器 - 解决无人机轨迹跟踪
算法·矩阵·自动驾驶·动态规划·无人机
橘颂TA18 分钟前
每日一练之链表的回文结构
数据结构·链表
誓约酱19 分钟前
(每日一题) 力扣 14 最长公共前缀
算法·leetcode·职场和发展
刃神太酷啦21 分钟前
数据结构(蓝桥杯常考点)
数据结构·c++·蓝桥杯c++组
17´32 分钟前
Qt从入门到入土(八) -打包Qt程序
开发语言·c++·qt
冠位观测者1 小时前
【Leetcode 每日一题 - 补卡】2070. 每一个查询的最大美丽值
数据结构·算法·leetcode
誓约酱1 小时前
(每日一题) 力扣 860 柠檬水找零
linux·c语言·c++·算法·leetcode·职场和发展
地平线开发者1 小时前
手把手基于 MINI 数据集带你做一次板端精度评估
算法·自动驾驶