数据结构 P50 算法实现 栈的应用-行编辑程序

来源:互联网 发布:大数据的由来 编辑:程序博客网 时间:2024/06/05 21:58
#include <iostream>
#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

阅读全文
0 0
原创粉丝点击