行編輯程式【堆疊和佇列】
Description
一個簡單的行編輯程式的功能是:接收用戶從終端輸入的程式或資料,并存入用戶的資料區。由于用戶在終端上進行輸入時,不能保證不出差錯,因此,若在編輯程式中,“每接收一個字符即存入用戶資料區”的做法顯然不是很恰當。較好的做法是,設立一個輸入緩沖區,用以接收用戶輸入的一行字符,然后逐行存入用戶資料區。允許用戶輸入出差錯,并在發現有誤時可以及時更正。例如,當用戶發現剛剛鍵入的一個字符是錯的時,可補進一個退格符“#”,以表示前一個字符無效;如果發現當前鍵入的行內錯誤較多或難以補救,則可以鍵入一個退行符“@”,以表示當前行中的字符均無效。例如假設從終端接收了這樣的兩行字符:
whil##ilr#e(s#*s)
outcha@ putchar(*s=#++);
則實際有效的是下列兩行:
while(*s)
putchar(*s++);
為此,可設這個輸入緩沖區為一個堆疊結構,每當從終端接收了一個字符之后先作如下判別:如果它不是退格符也不是退行符,則將該字符壓入堆疊頂;如果是一個退格符,則從堆疊頂刪去一個字符;如果它是一個退行符,則將字符堆疊清為空堆疊。
Input
若干行程式或者資料,每行不超過200個字符。
Output
經過行編輯程式處理過后的輸出。
Sample Input:
whil##ilr#e(s#*s)
outcha@ putchar(*s=#++);
Sample Output:
while(*s)
putchar(*s++);
下面是我寫的代碼,搞不明白為什么在平臺上提交一直轉圈圈應該runtime了
而且我感覺這個題有毛病,他題里說了出現@,前面一行字符就全沒了,但是他例子中的輸出對不上啊,例子是‘ putchar(*s++);’但是不應該是‘putchar(*s++);’嘛
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define sizezifu 200
typedef struct{
char *top;
char *base;
int size_zifu;
}zifu;
void init_zifu(zifu *s)
{
s->base = (char *)malloc(sizeof(char) * sizezifu);
if(!s->base)
{
exit(-1);
}
s->top = s->base;
s->size_zifu = sizezifu;
}
void push(zifu *s,char e)
{
*(s->top) = e;
s->top++;
}
void pop(zifu *s,int panduan)
{
if(s->top == s->base)
{
exit(-1);
}
if(panduan == 0)
{
--s->top;
}
else if(panduan == 1)
{
s->top = s->base;
}
}
int main(void)
{
char *st_r;
st_r = (char *)malloc(sizeof(char) * 200);
while(scanf("%s",st_r) != EOF)
{
zifu s;
init_zifu(&s);
int i = 0,panduan_1 = 0,panduan_2 = 1,panduan_3 = strlen(st_r);
for(i = 0;i < strlen(st_r);i++)
{
switch(st_r[i])
{
case '#':
pop(&s,panduan_1);
break;
case '@':
pop(&s,panduan_2);
break;
default:
push(&s,st_r[i]);
break;
}
}
st_r = s.base;
while(st_r != s.top)
{
printf("%c",*st_r);
st_r++;
}
printf("\n");
}
return 0;
}
uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/90279.html
標籤:C語言
上一篇:資料結構疑問
