您的位置:首页 > 其它

利用栈实现一个编辑器

2016-03-06 20:23 316 查看
再来看一个行编辑程序的示例,用户在终端输入字符,完成后保存用户的数据区, 因为在输入的过程中可能出错,需要修改,所以不可能每输入一个字符就存入数据区。比较好的做法是先在内存里开一个输入的缓冲区,当用户输入完成一行后,再存入数据区。在行内可以修改。例如,当用户发现刚输入的一个字符是错的之后,可以再输入一个'#',表示前一个字符是错的,如果发现当前行输入的错误太多,可以输入一个退行符'@',表示当前行都无效,举个例子:
whli#ilr#e(s#*s)
outcha@putchar(*s=#++)
实际有效的字符是这样的:
while(*s)
putchar(*s++)
解题思路:
可以把内存里这个输入缓冲区定为栈,正常情况下每输入一个字符直接入栈,如果发现字符是'#',就栈顶pop一次,如果是'@'就清空栈.代码实现如下:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
const int S_SIZE =100;   //栈的空间大小
using namespace std;
typedef struct
{
int top;  //栈顶
int maxtop;   //栈最大的存储空间
char *stack;
}SqStack;
//初始化空栈
void InitStack(SqStack &S)
{
S.stack=(char*)malloc(S_SIZE*sizeof(char))  ;//动态申请一维数组
S.maxtop=S_SIZE;
S.top=-1;
}
//判断空栈
int StackEmpty(SqStack &S)
{
if(S.top==-1)
return 1;
else
return 0;
}
//判断栈满
int  StackFull(SqStack &S)
{
if(S.top==S.maxtop)
return 1;
else
return 0;
}

//进栈
void push(SqStack &S,char x)
{
if(StackFull(S))
printf("overflow\n");
S.stack[++S.top]=x;
}
//出栈
void pop(SqStack &S)
{
if(StackEmpty(S))
printf("underflow\n");
S.top--;
}
void clear(SqStack &S)
{
S.top=-1;
}
void print(SqStack &S)
{
for(int i=0;i<=S.top;i++)
cout<<S.stack[i];
cout<<endl;
}
int main()
{
char c;
SqStack s;
while((c=getchar())!=EOF)
{
InitStack(s);
//对第一个字母的处理,当时漏了这一步结果第一个字母怎么都显示不出来
if(c=='#')
pop(s);
else
push(s,c);
while((c=getchar())!='\n')
{
if(c=='#')
pop(s);
else if(c=='@')
clear(s);
else
push(s,c);
}
print(s);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: