演算法3-2:行編輯程式 (c語言)
阿新 • • 發佈:2018-11-29
: 演算法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; }