一直 熬夜熬到 凌晨 3点 , 头昏昏沉沉 , 起身想把昨夜没有写完的一点 代码写了 , 写完之后 , 寝室还没有来电 , 舍友也还在睡觉 , 可是天真的很亮很亮了.
这个行编辑程序是这样的 , 把控制台(键盘)上的每一个输入的 字符都 入栈 , 以0位 文件结束符,@表示整个一行都输错了,要重新输入. #表示刚才的一个字符输错了,撤销掉它 . 按下 回车之后 , 会把之前输的所有合法的字符输出到控制台上.
这个行编辑程序是基于栈的. #要撤销一个字符 , 对应的操作就是退栈 . 而@要撤销掉刚输入的所有字符 , 对应的操作就是清空 栈.
按下回车之后会把输入的合法字符都输出到控制台上 , 对应的操作就是依次输出栈元素.
下面是代码:(用c++写的)
#include<iostream>
#include<stdlib.h>
using namespace std;
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间增量
typedef struct
{
char *base; //栈构造之前和销毁之后,base为null
char *top ; //栈顶指针
int stacksize;
}SqStack;
int main()
{
//申明
void LineEdit();
LineEdit();
}
bool InitStack(SqStack &s) //构造一个空栈
{
s.base = (char*) malloc(STACK_INIT_SIZE * sizeof(char) );
if(!s.base)
{
cout<<"空间分配失败!"<<endl;
return false;
}
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return true;
}
bool Push(SqStack &s , char &e) //插入元素e为新的栈顶元素
{
if(s.top - s.base >= s.stacksize) //栈满,追加存储空间
{
s.base = (char*) realloc(s.base , (s.stacksize + STACKINCREMENT) * sizeof(char) );
if(!s.base)
{
cout<<"空间分配失败!"<<endl;
return false;
}
s.top = s.base+ s.stacksize;
s.stacksize += STACKINCREMENT;
}
*s.top++ =e;
return true;
}
bool ClearStack(SqStack &s) //把s置为空栈
{
if(s.base == NULL) return false;
else
{
s.top = s.base;
return true;
}
}
bool Pop(SqStack &s , char &e) //出栈 , 出栈元素赋给e
{
if(s.top == s.base) return false;
e = *--s.top;
return true;
}
void DestroyStack(SqStack &s)
{
free(s.base);
free(s.top);
free(&s);
}
void LineEdit()
{
//申明
bool InitStack(SqStack &s) ;
bool Pop(SqStack &s , char &e);
bool ClearStack(SqStack &s);
void DestroyStack(SqStack &s);
bool Push(SqStack &s , char &e);
void vist(SqStack s);
SqStack s;
char c; //接收退栈后的元素
InitStack(s);
cout<<"请输入:"<<endl;
char ch = getchar(); //从终端接收一个字符
while(ch != 0) //设定0为全文结束符
{
while(ch!= 0 && ch!='\n')
{
switch(ch)
{
case '#' : Pop(s , c); break;
case '@' : ClearStack(s); break;
default: Push(s ,ch); break;
}
ch = getchar(); //从终端接收下一个字符
}
vist(s);
ClearStack(s);
cout<<endl;
if(ch != 0) ch = getchar();
}
DestroyStack(s);
}
void vist(SqStack s)
{
if(s.base == s.top)
{
cout<<"行输入为空"<<endl;
}
else
{
cout<<"行编辑的结果:";
do
{
cout<<*s.base;
s.base ++;
}while(s.base != s.top);
}
}
下面是运行结果图:
4点了,就写到这里. 最后多谢严蔚敏的支持.