#include<conio.h>
using namespace std;
#define STACK_INIT_SIZE 100 //初始存储容量
#define STACKINCERMENT 10 //存储空间增量
struct SqStack //顺序栈的定义
{
char *base; //栈底指针
char *top; //栈顶指针
int stacksize; //当前最大容量
};
bool InitStack(SqStack &S) //构造一个空栈
{
S.base=new char [STACK_INIT_SIZE]; //先给空栈分配一个初始空间
if(!S.base) return 0; //分配失败则返回0
S.top=S.base; //栈顶指针初值指向栈底指针,代表空栈
S.stacksize=STACK_INIT_SIZE; //赋予栈当前的最大容量值
return 1;
}
int GetTop(SqStack S,char &e) //若栈不空,则用e返回S的栈顶元素
{
if(S.top==S.base) return 0; //如果栈为空,则返回0
e=*(S.top-1); //如果栈不为空,则用e返回栈顶元素
return e;
}
bool Push(SqStack &S,char e) //插入元素e为新的栈顶元素
{
if(S.top-S.base>S.stacksize) //如果栈满,则给栈追加存储空间
{
S.base=new char[STACKINCERMENT];
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCERMENT;
}
if(!S.base) return 0; //如果分配失败,则返回0
*S.top=e; //把e的值赋给栈顶指针 ,可合并为 *S.top++=e; (++运算级高于*)
++S.top; //栈顶指针地址加一
return 1;
}
bool Pop(SqStack &S) //若栈不空,则删除S的栈顶元素
{
if(S.top==S.base) //若栈为空,返回0
return 0;
*(--S.top)=NULL; //把栈顶指针指向的值赋给e
return 1;
}
void LineEdit(SqStack s) //利用字符栈s,从终端接收一行并传送至调用过程的数据区
{//1
char ch;
SqStack d; //创建一个字符串d,用于打印输入的字符串
InitStack(s); //构造一个空栈s
InitStack(d); //构造一个空栈d
ch=getchar(); // ch 接收字符
while(ch!=EOF) //文件输入结束时循环停止
{//2
while(ch!='\n')
{//3
switch(ch)
{//4
case'#': //#-退格
Pop(s);
break;
case'@': //@-删除缓冲区所有字符
while(s.base!=s.top)
{Pop(s);}
break;
default:
Push(s,ch); //有效字符进栈
break;;
}//4
ch=getchar();
}//3
while(s.base!=s.top) //由于栈的特性先进后出,利用字符栈d将s里面的字符串接收一遍
{
GetTop(s,ch);
Push(d,ch);
Pop(s);}
while(d.base!=d.top)//打印字符串
{
GetTop(d,ch);
cout<<ch;
Pop(d);
}
cout<<endl;
if(ch!=EOF) ch=getchar();
}//2
}//1
int main()
{
SqStack s; //定义一个栈s
InitStack(s); //初始化栈
LineEdit(s);
while(1){}
delete [] s.base;
return 0;
}
——————————————————————————————————————————
/*算法3.2*/
void LineEdit(SqStack s) //利用字符栈s,从终端接收一行并传送至调用过程的数据区
{//1
char ch;
SqStack d; //创建一个字符串d,用于打印输入的字符串
InitStack(s); //构造一个空栈s
InitStack(d); //构造一个空栈d
ch=getchar(); // ch 接收字符
while(ch!=EOF) //文件输入结束时循环停止
{//2
while(ch!='\n')
{//3
switch(ch)
{//4
case'#': //#-退格
Pop(s);
break;
case'@': //@-删除缓冲区所有字符
while(s.base!=s.top)
{Pop(s);}
break;
default:
Push(s,ch); //有效字符进栈
break;;
}//4
ch=getchar();
}//3
while(s.base!=s.top) //由于栈的特性先进后出,利用字符栈d将s里面的字符串接收一遍
{
GetTop(s,ch);
Push(d,ch);
Pop(s);}
while(d.base!=d.top)//打印字符串
{
GetTop(d,ch);
cout<<ch;
Pop(d);
}
cout<<endl;
if(ch!=EOF) ch=getchar();
}//2
}//1