【数据结构】栈应用 行编辑器

在终端输入一串字符 当发现刚刚输入的字符有误,可以输入 # ,表示前一个字符无效;当想清除该行 则输入 @


例如:

` 输入: hellow#

输出: hello


输入: hellow@

输出



#ifndef _EDIT_H_
#define	_EDIT_H_

#include <iostream>  
#include <stdlib.h>  
#include <malloc.h>  

using namespace std;

#define STACKSIZE 100  

typedef char ElemType;
typedef struct
{
	ElemType stack[STACKSIZE];
	int top;
}SeqStack;

void InitStack(SeqStack *S);//初始化栈  
int StackEmpty(SeqStack S);//判断栈是否为空  
int GetTop(SeqStack S,ElemType *e);//取栈顶元素  
int PushStack(SeqStack *S,ElemType e);//入栈  
int PopStack(SeqStack *S,ElemType *e);//出栈  
int StackLength(SeqStack S);//求栈长度  
void ClearStack(SeqStack *S);//清空栈  
void LineEdit();//行编辑函数  

#endif

#include"Edit.h"

void InitStack(SeqStack *S)//将栈S初始化为空栈  
{
	S->top = 0;
}
int StackEmpty(SeqStack S)//判断栈是否为空,栈为空返回1,否则返回0  
{
	if (0 == S.top)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int GetTop(SeqStack S,ElemType *e)//取栈顶元素,将栈顶元素值返回给e,并返回1表示成功,返回0表示失败  
{
	if (S.top <= 0)
	{
		cout << "栈已经空!"<<endl;
		return 0;
	}
	else
	{
		*e = S.stack[S.top - 1];//取栈顶元素  
		return 1;
	}
}
int PushStack(SeqStack *S,ElemType e)//进栈操作  
//将元素e进栈,元素进栈成功返回1,否则返回0  
{
	if (S->top >= STACKSIZE - 1)
	{
		cout<<"栈已满,不能入栈!";
		return 0;
	}
	else
	{
		S->stack[S->top] = e;
		S->top++;
		return 1;
	}
}
int PopStack(SeqStack *S,ElemType *e)//出栈操作  
{
	if (S->top <= 0)
	{
		cout<<"栈已经没有元素,不能出栈!"<<endl;
		return 0;
	}
	else
	{
		S->top--;
		*e = S->stack[S->top];
		return 1;
	}
}
int StackLength(SeqStack S)//返回栈长度  
{
	return S.top;
}
void ClearStack(SeqStack *S)//清空栈  
{
	S->top = 0;
}

void LineEdit()//行编辑函数  
{
	SeqStack S;
	char ch;
	ElemType e;
	ElemType a[50];
	int i,j = 0;
	InitStack(&S);
	cout<<"输入字符序列(#表示前一个字符无效,@表示当前行字符无效)"<<endl;
	ch = getchar();
	while (ch != '\n')
	{
		switch (ch)
		{
		case '#':
			if (!StackEmpty(S))
			{
				PopStack(&S,&ch);//栈顶元素出栈  
			}
			break;
		case '@':
			ClearStack(&S);//清空栈  
			break;
		default:
			PushStack(&S,ch);//字符进栈  
		}
		ch = getchar();//读入下一个字符  
	}
	while (!StackEmpty(S))
	{
		PopStack(&S,&e);//字符出栈并存入数组中  
		a[j++] = e;
	}
	for (i = j - 1; i >= 0; i--)
	{
		cout<<a[i];//输出正确的字符序列  
	}
	cout << endl;
	ClearStack(&S);//为下一次输入做准备  
}

#include"Edit.h"

int main(void)
{
	LineEdit();
	return 0;
}

相关文章

键树的基本概念 键树又称数字查找树(Digital Search Tree)。 它是一棵度大于等于2的树,树中的每个结...
[TOC] 基本概念 数据: 数据 是对客观事物的符号表示,在计算机科学中指所有能输入到计算机中并被计算机...
[TOC] 反证法 基本概念: 一般地,假设原命题不成立(即 在原命题的条件下,结论不成立),经过正确的推...
最近抽空整理了&quot;数据结构和算法&quot;的相关文章。在整理过程中,对于每种数据结构和算法...
[TOC] 矩阵在计算机图形学、工程计算中占有举足轻重的地位。在数据结构中考虑的是如何用最小的内存空间...
[TOC] 大O表示法:算法的时间复杂度通常用大O符号表述,定义为T[n] = O(f(n))。称函数T(n)以f(n)为界或...