HNCU 1741: 算法3-2:行编辑程序
題目描述
一個簡單的行編輯程序的功能是:接收用戶從終端輸入的程序或數據,并存入用戶的數據區。由于用戶在終端上進行輸入時,不能保證不出差錯,因此,若在編輯程序中,“每接收一個字符即存入用戶數據區”的做法顯然不是很恰當。較好的做法是,設立一個輸入緩沖區,用以接收用戶輸入的一行字符,然后逐行存入用戶數據區。允許用戶輸入出差錯,并在發現有誤時可以及時更正。例如,當用戶發現剛剛鍵入的一個字符是錯的時,可補進一個退格符“#”,以表示前一個字符無效;如果發現當前鍵入的行內錯誤較多或難以補救,則可以鍵入一個退行符“@”,以表示當前行中的字符均無效。例如假設從終端接收了這樣的兩行字符:
whil##ilr#e(s#*s)
outcha@ putchar(*s=#++);
則實際有效的是下列兩行:
while(*s)
putchar(*s++);
為此,可設這個輸入緩沖區為一個棧結構,每當從終端接收了一個字符之后先作如下判別:如果它不是退格符也不是退行符,則將該字符壓入棧頂;如果是一個退格符,則從棧頂刪去一個字符;如果它是一個退行符,則將字符棧清為空棧。上述處理過程可用下面算法描述之:
圖:行編輯程序算法
輸入
若干行程序或者數據,每行不超過200個字符。
輸出
經過行編輯程序處理過后的輸出。
樣例輸入
whil##ilr#e(s#*s)
outcha@ putchar(*s=#++);
樣例輸出
while(*s)
putchar(*s++);
類似于線性表里面順序表,順序棧,自己樣例試了都沒有錯,只不過提交顯示是話嘮,不是很懂這個OJ。。
#include<stdio.h> #include<stdlib.h>#define OK 1 #define ERROR 0 #define OVERFLOW 0 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef int SElemtype; typedef int Status;typedef struct {SElemtype *base;SElemtype *top;int stacksize; }SqStack;Status InitStack(SqStack *p)//初始化棧 {p->base = (SElemtype*)malloc(STACK_INIT_SIZE*sizeof(SElemtype));if(!p->base )exit(OVERFLOW);p->top = p->base ;p->stacksize = STACK_INIT_SIZE;return OK; }Status ClearStack(SqStack *q)//清空棧 {if(q->base == q->top )return ERROR;q->top = q->base ;return OK; }Status Pop(SqStack *q,char *ch)//出棧 {if(q->base == q->top )return ERROR;*ch = *--(q->top);return OK; }Status Push(SqStack *q,char *ch)//入棧 {SElemtype *newbase;if((q->top -q->base ) >= q->stacksize ){newbase = (SElemtype*)realloc(q->base,(q->stacksize +STACKINCREMENT)*sizeof(SElemtype));if(!newbase)exit(OVERFLOW);q->base = newbase;q->stacksize += STACKINCREMENT;}*(q->top) ++ = *ch;return OK; } Status StackEmpty(SqStack *q)//判斷是否為空 {if( q->base == q->top )return OK;return ERROR; }Status DestroyStack(SqStack *q) {q->base = NULL;return OK; } void LineEdit() {//利用字符棧s,從終端接收一行并傳送至調用過程的數據區 SqStack p;SElemtype *s;char ch;InitStack(&p);//構造空棧 ch = getchar();//從終端接收第一個字符 while(ch!=EOF)//EOF為全文結束符 {while(ch!=EOF&&ch!='\n'){switch(ch){case '#':Pop(&p,&ch);break;//僅當棧非空時退棧 case '@':ClearStack(&p);break;//重置p為空棧 default :Push(&p,&ch);break;//有效字符進棧,未考慮棧滿的情形 }ch = getchar();//從終端接收下一個字符 }s = p.base ;while(s != p.top ){ch = *s;putchar(*s);s++;}printf("\n");//將從棧底到棧頂的棧內字符傳送至調用過程的數據區 ClearStack(&p);if(ch!=EOF)getchar();//讀取下一行的第一個字符 }DestroyStack(&p); } int main() {LineEdit();return 0;}轉載于:https://www.cnblogs.com/hellocheng/p/7350136.html
總結
以上是生活随笔為你收集整理的HNCU 1741: 算法3-2:行编辑程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux上磁盘热插拔
- 下一篇: 交换机的三种转发模式