9、蛤蟆的数据结构笔记之九栈的应用之行编辑实现

9、蛤蟆的数据结构笔记之九栈的应用之行编辑实现

本篇名言:“人生照例是一场值得一搏的争衡,然而它的奖品是拼斗。

继续栈结构的应用,行编辑。

欢迎转载,转载请标明出处:

1.  行编辑

行编辑的功能是接受用户从终端输入的程序或数据。每接受一个字符即存入用户数据区的做法不是最恰当的。好的做法是建立一个缓存区,允许洪湖输入出错,并在发现有无时可以及时更正。用栈来实现这个输入缓冲区是非常适合的。

每当从终端接受了一个字符后先作判别,如果不是退格符也不是退行符,则将该字符压入栈顶;如果是退格符则从栈顶去除一个字符,如果是退行符,则将字符栈清空。

2.  压栈出栈

基本和之前的例子相似,可以再源码中查看。

Status Push(SqStack *S,SElemType
e)

{

if(S->top-S->base>=S->stacksize)

return ERROR;

*S->top++=e;

return OK;

}

SElemType Pop(SqStack *S)

{

chare;

if(S->top==S->base)

return0;

e=*--S->top;

returne;

}

3.  LineEdit()

LineEdit函数是本栈应用的核心。主要逻辑是:

输入字符,判断是否为EOF,如果不是则判断是否是回车,如果是EOF则退出程序,如果是\n,则退出子循环(第二个while循环),如果都不是则对字符进行选择处理,#删除一个字符,@删除整行字符,其他则入栈保存,等出现回车或者EOD(CTRL+C)时候进行输出。

void LineEdit()

{//利用字符栈S,从终端接收一行并传送至调用过程的数据区。

chart;

InitStack(&S);

InitStack(&S1);

ch=getchar();

while(ch!=EOF){//EOF为全文结束符

while(ch!=EOF&&ch!=‘\n‘){

switch(ch){

case ‘#‘:Pop(&S);break;//仅当栈非空时退栈

case ‘@‘:{while(!StackEmpty(&S))Pop(&S);};break;//构造空栈S

default:Push(&S,ch);break;//有效字符进栈,未考虑栈满情形

}

ch=getchar();//从终端接收下一字符

}

while(!StackEmpty(&S)){

t=Pop(&S);

Push(&S1,t);

}

printf("echo:>");

while(!StackEmpty(&S1)){

t=Pop(&S1);

printf("%c",t);

}

printf("\n");

if(ch!=EOF)ch=getchar();

}

DestoryStack(&S);

DestoryStack(&S1);

}

4.  Main函数

Main只调用LineEdit函数,最后如下图1 所示

void main()

{

LineEdit();

}

5.  源码

#include
"stdio.h"

#include
"string.h"

#include
"stdlib.h"

#define
STACK_INIT_SIZE100

#define
OVERFLOW 0

#define
OK 1

#define
ERROR 0

typedef
int
Status;

typedef
char
SElemType;

typedef
struct
SqStack{

SElemType*base;

SElemType*top;

intstacksize;

}SqStack;

//初始化栈

SqStack S,S1;

char ch,c;

Status InitStack(SqStack *S)

{

S->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!S->base)exit(OVERFLOW);

S->top=S->base;

S->stacksize=STACK_INIT_SIZE;

return OK;

}

void DestoryStack(SqStack *S)

{//栈的销毁

free(S->base);

S->stacksize=0;

}

void ClearStack(SqStack *S)//栈的清空

{

S->stacksize=0;

}

Status StackEmpty(SqStack *S)//判断栈是否为空

{

if(S->top==S->base)

return1;

else

return0;

}

int StackLength(SqStack
S)

{//栈的长度 求栈里有多少个元素

return S.top-S.base;

}

Status GetTop(SqStack
S,SElemType
e)

{//取栈顶元素

if(S.top==S.base)return
ERROR;

e=*(S.top-1);

return OK;

}//GetTop

Status Push(SqStack *S,SElemType
e)

{

if(S->top-S->base>=S->stacksize)

return ERROR;

*S->top++=e;

return OK;

}

SElemType Pop(SqStack *S)

{

chare;

if(S->top==S->base)

return0;

e=*--S->top;

returne;

}

void LineEdit()

{//利用字符栈S,从终端接收一行并传送至调用过程的数据区。

chart;

InitStack(&S);

InitStack(&S1);

ch=getchar();

while(ch!=EOF){//EOF为全文结束符

while(ch!=EOF&&ch!=‘\n‘){

switch(ch){

case ‘#‘:Pop(&S);break;//仅当栈非空时退栈

case ‘@‘:{while(!StackEmpty(&S))Pop(&S);};break;//构造空栈S

default:Push(&S,ch);break;//有效字符进栈,未考虑栈满情形

}

ch=getchar();//从终端接收下一字符

}

while(!StackEmpty(&S)){

t=Pop(&S);

Push(&S1,t);

}

printf("echo:>");

while(!StackEmpty(&S1)){

t=Pop(&S1);

printf("%c",t);

}

printf("\n");

if(ch!=EOF)ch=getchar();

}

DestoryStack(&S);

DestoryStack(&S1);

}

void main()

{

LineEdit();

}

时间: 2024-10-14 20:44:11

9、蛤蟆的数据结构笔记之九栈的应用之行编辑实现的相关文章

13、蛤蟆的数据结构笔记之十三栈的应用之栈与递归之斐波那契数列

13.蛤蟆的数据结构笔记之十三栈的应用之栈与递归之斐波那契数列 本篇名言:"人生不是一支短短的蜡烛,而是一支由我们暂时拿着的火炬,我们一定要把它燃得." 继续递归的斐波那契数列问题. 欢迎转载,转载请标明出处: 1.  斐波那契数列 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学

11、蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现

11.蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现 本篇名言:"人生不售来回票,一旦动身,绝不能复返." 继续栈应用实现,这次是来看下表达式求值的栈实现. 欢迎转载,转载请标明出处: 1.  表达式求值 表达式求值是设计语言编译中的一个基本问题,它的实现是栈应用的又一个典型例子. 任何一个表达式都是由操作数(Operand).运算符(operator)和界限符(delimiter)组成. 操作数可以是常数也可以是变量或变量的标识符. 运算符可以分为算术运算符.关系运算符和逻辑运算符

5、蛤蟆的数据结构笔记之五链栈实现

5.蛤蟆的数据结构笔记之五链栈实现 本篇名言:"人生就像奕棋,一步失误,全盘皆输." 昨天对栈和队列进行了定义.这次我们来看下如何使用代码来实现链栈和链队列,后续蛤蟆会记录如何将栈应用到实际问题中. 栈一般是顺序结构,但是也可以采用链式存储结构,具体如下实现. 欢迎转载,转载请标明出处: 1.  定义结构体 #define MAX_STACKS10 typedef struct { intkey; /*otherfields */ }element; typedef struct st

49. 蛤蟆的数据结构笔记之四十九图的连通性问题

49. 蛤蟆的数据结构笔记之四十九图的连通性问题 本篇名言:"我们不得不饮食.睡眠.游惰.恋爱,也就是说,我们不得不接触生活中最甜蜜的事情:不过我们必须不屈服于这些事物 .....--约里奥?居里"     此篇就作为数据结构入门笔记的最后一篇吧. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47135259 设图G=(V,E)是一个无向图,G的一个连通分支是一个最大的连通子图,即一个连通分支是不包含在任何更大的

15、蛤蟆的数据结构笔记之十五栈的应用之栈与递归之八皇后问题

15.蛤蟆的数据结构笔记之十五栈的应用之栈与递归之八皇后问题 本篇名言:"人的一生应当这样度过:当回忆往事的时候,他不致于因为虚度年华而痛悔,也不致于因为过去的碌碌无为而羞愧:在临死的时候,他能够说:"我的整个生命和全部精力,都已经献给世界上最壮丽的事业--为人类的解放而斗争." 继续递归问题,本次是经典的八皇后问题: 欢迎转载,转载请标明出处: 1.  八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出

14、蛤蟆的数据结构笔记之十四栈的应用之栈与递归之阿克曼函数

14.蛤蟆的数据结构笔记之十四栈的应用之栈与递归之阿克曼函数 本篇名言:"今天就是生命 ----- 是唯一你能确知的生命." 继续递归应用,阿克曼函数. 欢迎转载,转载请标明出处: 1.  阿克曼函数 阿克曼函数(Ackermann)是非原始递归函数的例子.它需要两个自然数作为输入值,输出一个自然数.它的输出值增长速度非常高,仅是对于(4,3)的输出已大得不能准确计算. Ackermann函数定义如下: 若m=0,返回n+1. 若m>0且n=0,返回Ackermann(m-1,1

7、蛤蟆的数据结构笔记之七栈的应用之数制转换

7.蛤蟆的数据结构笔记之七栈的应用之数制转换 本篇名言:"人生意义的大小,不在乎外界的变迁,而在乎内心的经验." 上面两篇中我们实现了链栈和链队列,接下去哦我们看看实际中栈的应用场景.本次来看下栈在数制转换的作用. 欢迎转载,转载请标明出处: 1.  原理介绍 十进制N和其他进制数的转换时计算机实现计算的基本问题.简单算法如下: N=(N div d )x d + N modd 2.  实现 2.1         定义结构体 定义堆栈的结构体 typedef struct { int

29、蛤蟆的数据结构笔记之二十九数组之硬币抛掷模拟

29.蛤蟆的数据结构笔记之二十九数组之硬币抛掷模拟 本篇名言:"人生是各种不同的变故.循环不已的痛苦和欢乐组成的.那种永远不变的蓝天只存在于心灵中间,向现实的人生去要求未免是奢望.-- 巴尔扎克" 欢迎转载,转载请标明出处: 1.  硬币抛掷 如果抛掷硬币N次,看到头像的期望值是N/2次,但实际值也可能是0~N次,在程序中进行M次试验,M和N都在代码中定义.它使用一个数组f来跟踪出现"i次头像"的概率,其中0≤j≤N.然后打印试验结果的柱状图,每出现10次用1个星号

16、蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题

16.蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题 本篇名言:"人生的价值,并不是用时间,而是用深度去衡量的." 继续栈与递归应用,汉诺塔问题. 欢迎转载,转载请标明出处: 1.  汉诺塔问题 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一