1. 程式人生 > >演算法3-2:行編輯程式 (c語言)

演算法3-2:行編輯程式 (c語言)

: 演算法3-2:行編輯程式

時間限制:1 Seconds 記憶體限制:32 Mbyte
總提交:65 正確:9 作者:外部匯入
[提交] [統計] [提問]

題目描述

  一個簡單的行編輯程式的功能是:接收使用者從終端輸入的程式或資料,並存入使用者的資料區。由於使用者在終端上進行輸入時,不能保證不出差錯,因此,若在編輯程式中,“每接收一個字元即存入使用者資料區”的做法顯然不是很恰當。較好的做法是,設立一個輸入緩衝區,用以接收使用者輸入的一行字元,然後逐行存入使用者資料區。允許使用者輸入出差錯,並在發現有誤時可以及時更正。例如,當用戶發現剛剛鍵入的一個字元是錯的時,可補進一個退格符“#”,以表示前一個字元無效;如果發現當前鍵入的行內錯誤較多或難以補救,則可以鍵入一個退行符“@”,以表示當前行中的字元均無效。例如假設從終端接收了這樣的兩行字元:

whil##ilr#e(s#*s)
[email protected] putchar(*s=#++);
則實際有效的是下列兩行:
while(*s)
putchar(*s++);

  為此,可設這個輸入緩衝區為一個棧結構,每當從終端接收了一個字元之後先作如下判別:如果它不是退格符也不是退行符,則將該字元壓入棧頂;如果是一個退格符,則從棧頂刪去一個字元;如果它是一個退行符,則將字元棧清為空棧。上述處理過程可用下面演算法描述之: 

圖:行編輯程式演算法

輸入描述

若干行程式或者資料,每行不超過200個字元。

輸出描述

經過行編輯程式處理過後的輸出。

輸入樣例
whil##ilr#e(s#*s)

[email protected] putchar(*s=#++);

輸出樣例
while(*s)
putchar(*s++);

#include<stdio.h>
#include<string.h>

typedef struct Stack  //模擬棧
{
    char s[305];
    int top;  //棧頂
    int base;  //棧底
}STACK, *Stack;

void Init(Stack S)  //棧的初始化
{
    S->top = 0;
    S->base = 0;
}

void Pop(Stack S, char *e)  //出棧操作
{
    (*e) = S->s[--S->top];
}

void Push(Stack S, char c)  //入棧操作
{
    S->s[S->top++] = c;
}

int main()
{
    STACK S;
    char e;
    int i, j, h;
    char a[205];
    while(gets(a) != NULL)
    {
        h = strlen(a);
        Init(&S);
        for(i = 0; i < h; i++)
        {
            if(a[i] == '#')
            {
                Pop(&S, &e);
            }
            else if(a[i] == '@')
            {
                Init(&S);
            }
            else
            {
                Push(&S, a[i]);
            }
        }
        while(S.base != S.top)
        {
            printf("%c", S.s[S.base++]);
        }
        printf("\n");
    }
    return 0;
}