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;
}
相关推荐
Am心若依旧4091 分钟前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
Yan.love10 分钟前
开发场景中Java 集合的最佳选择
java·数据结构·链表
zh路西法11 分钟前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(一):从电梯出发的状态模式State Pattern
c++·决策树·状态模式
AC使者15 分钟前
#B1630. 数字走向4
算法
冠位观测者19 分钟前
【Leetcode 每日一题】2545. 根据第 K 场考试的分数排序
数据结构·算法·leetcode
轩辰~25 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
lxyzcm1 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
蜀黍@猿1 小时前
C/C++基础错题归纳
c++
古希腊掌管学习的神1 小时前
[搜广推]王树森推荐系统笔记——曝光过滤 & Bloom Filter
算法·推荐算法
qystca1 小时前
洛谷 P1706 全排列问题 C语言
算法