行编辑程序

本文介绍了一个基于栈实现的行编辑程序,该程序能够处理撤销单个字符、撤销整行及正常输入等操作,并提供了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直 熬夜熬到 凌晨 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点了,就写到这里. 最后多谢严蔚敏的支持.


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值