数据结构实验之栈:行编辑器
題目描述
一個簡單的行編輯程序的功能是:接受用戶從終端輸入的程序或數據,并存入用戶的數據區。? 由于用戶在終端上進行輸入時,不能保證不出差錯,因此,若在編輯程序中,“每接受一個字符即存入用戶數據區”的做法顯然不是最恰當的。較好的做法是,設立一個輸入緩沖區,用以接受用戶輸入的一行字符,然后逐行存入用戶數據區。允許用戶輸入出差錯,并在發現有誤時可以及時更正。例如,當用戶發現剛剛鍵入的一個字符是錯的時,可補進一個退格符"#",以表示前一個字符無效;? 如果發現當前鍵入的行內差錯較多或難以補救,則可以鍵入一個退行符"@",以表示當前行中的字符均無效。? 如果已經在行首繼續輸入'#'符號無效。?輸入
輸入多行字符序列,行字符總數(包含退格符和退行符)不大于250。?輸出
按照上述說明得到的輸出。?示例輸入
whli##ilr#e(s#*s) outcha@putchar(*s=#++);示例輸出
while(*s)putchar(*s++);
#include <stdio.h> #include <stdlib.h> #include<malloc.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define OVERFLOW -1 #define ERROR ?-2 typedef char SElemType; typedef struct {SElemType *base;//棧底指針SElemType *top;//棧頂指針int stacksize;//當前已分配的存儲空間,以元素為單位 }SqStack;
void InitStack(SqStack &S)// 構造一個空棧S {S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base) exit(OVERFLOW);//存儲分配失敗S.top=S.base;S.stacksize=STACK_INIT_SIZE; } void DestroyStack(SqStack &S)//銷毀棧; {S.top=NULL; S.stacksize=0; } void ClearStack(SqStack &S)//清空棧; {S.top=S.base; }
void Push(SqStack &S,SElemType e)// 插入元素e為新的棧頂元素 {if(S.top-S.base>=S.stacksize){// 當前存儲空間已滿,增加分配S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.base) exit(OVERFLOW);//存儲分配失敗S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;//增加存儲容量}*S.top++=e; }
int Pop(SqStack &S,SElemType &e)//若棧不空,則刪除S的棧頂元素,并 ? ??//用e返回其值,并返回OK,否則返回//ERROR {if(S.top==S.base) return ERROR;e=*--S.top;return OK; }
int GetTop(SqStack S,SElemType &e)//若棧不空,則用e返回S的棧頂元素,并//返回OK,否則返回ERROR {if(S.top==S.base) return ERROR;e=*(S.top-1);return OK; }
void PutStack(SqStack &S) {while(S.top>S.base){S.top--;printf("%d",*S.top);}printf("\n"); }
void LineEdit()//行編譯函數; {char ch,*temp;SqStack S;//棧的定義;InitStack(S);//棧的初始化;ch=getchar();while(ch!=EOF){while(ch!=EOF&&ch!='\n'){switch(ch){case '#':Pop(S,ch);break;//出棧操作;case '@':ClearStack(S);break;//清空棧;default :Push(S,ch);break;//進棧;}ch=getchar();}temp=S.base;//temp指針指向base指針;while(temp!=S.top){printf("%c",*temp);++temp;}ClearStack(S);//清空棧;printf("\n");if(ch!=EOF){ch=getchar();} }DestroyStack(S);//銷毀棧; }
int main() {LineEdit();return 0; }
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> using namespace std; #define maxsize 10000 typedef struct Stack {int Size;char *top,*base; } Stack;bool Empty(Stack &s) {if (s.top == s.base){return 1;}return 0; }void Creat(Stack &s)//棧的初始化; {s.base=new char[maxsize];s.top=s.base;s.top++;s.base++;s.Size=maxsize; }void push(Stack &s,char e) {if (s.top-s.base >= s.Size){s.base=(char *)realloc(s.base,2*maxsize*sizeof(Stack));s.Size+=maxsize;///s.top=s.base+s.Size;}s.top++;*s.top=e; }void pop(Stack &s) {if (s.top != s.base){s.top--;} }void print(Stack &s) {while (!Empty(s)){cout<<*s.top;pop(s);} }void out(Stack &s)//棧內元素的輸出 {s.base++;while(s.base<=s.top){cout<<*s.base;s.base++;}cout<<endl; }void Clear(Stack &s) {while (!Empty(s)){pop(s);} }void edit(Stack &s,char str[]) {int i;for(i=0; str[i]; i++){if (str[i] == '#' && !Empty(s)){pop(s);//出棧;}else if(str[i] == '@'){Clear(s);//清空棧;}else if (str[i]!='#'&&str[i]!='@'){push(s,str[i]);//進棧;}} } int main() {char str[333];while(gets(str)!=NULL){Stack s;Creat(s);edit(s,str);out(s);}return 0; }
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的数据结构实验之栈:行编辑器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SVN分支/合并
- 下一篇: 机器学习——决策树的实现