行编辑程序(基于链栈)

来源:互联网 发布:纳斯卡线条 知乎 编辑:程序博客网 时间:2024/06/13 06:38

行编辑程序只需要在链栈的基础上加上行编辑程序函数:

void LineEdit(Stack *st);//行编辑


函数如下:

void LineEdit(Stack *st)//单个字符处理{int i,j = 0;char ch;ElemType a[100];InitStack(st);cout<<"请输入字符串:"<<endl;ch = getchar();while(ch != '\n'){switch(ch){case '#':if(!StackEmpty(st)){pop(st);}break;case '@':clear(st);break;default:push(st,ch);}ch = getchar();}while(!StackEmpty(st)){ElemType e = GetTop(st);a[j++] = e;pop(st);}for(i = j-1;i>=0;i--){cout<<a[i];}cout<<endl;clear(st);}


具体代码如下:

头文件

#ifndef _STACK_H#define _STACK_H#include<iostream>#include<assert.h>using namespace std;#define ElemType chartypedef struct Node{ElemType data;struct Node *next;}Node,*PNode;typedef struct Stack{PNode top;PNode rear;size_t size;}Stack;int StackEmpty(Stack *st);void InitStack(Stack *st);//初始化bool push(Stack *st,ElemType x);//尾插bool pop(Stack *st);//头删void ShowStack(Stack *st);//打印void clear(Stack *st);//清除void destroy(Stack *st);//摧毁int length(Stack *st);//长度ElemType GetTop(Stack *st);//栈顶元素void LineEdit(Stack *st);//行编辑#endif


函数定义如下

#include "Stack.h"int StackEmpty(Stack *st){if(st->size == 0){return 1;}return 0;}void InitStack(Stack *list)//初始化{Node* s = (Node*)malloc(sizeof(Node));assert(s != NULL);s->next = NULL;list->rear = list->top = s;list->size = 0;}bool push(Stack *st, ElemType x)//尾插{Node *p = (Node*)malloc(sizeof(Node));assert(p != NULL);p->data = x;p->next = st->top->next;st->top->next = p; st->size++;return true;}void ShowStack(Stack *st)//打印{Node *p = st->top->next ;cout<<"NULL"<<endl;while(p != NULL){cout<<p->data <<endl;p = p->next ;}}bool pop(Stack *st)//头删{if(StackEmpty(st)){cout<<"栈已空,不能出栈!"<<endl;return false;}Node *p = st->top->next;if(st->size == 1){free(p);st->top->next = NULL;st->rear = st->top;}else{st->top->next = p->next ;free(p);}st->size--;return true;}ElemType GetTop(Stack *st)//栈顶元素{if(StackEmpty(st)){printf("栈已空,没有栈顶元素!\n");return -1;}return st->top->next->data;}void clear(Stack *st)//清除{Node *p = st->top->next;while(p != NULL){st->top->next = p->next;free(p);p = st->top->next;}st->rear  = st->top ;st->size  = 0; }void destroy(Stack *st)//摧毁{clear(st);free(st->top);st->top = st->rear = NULL;}int length(Stack *st)//长度{return st->size ;}void LineEdit(Stack *st)//单个字符处理{int i,j = 0;char ch;ElemType a[100];InitStack(st);cout<<"请输入字符串:"<<endl;ch = getchar();while(ch != '\n'){switch(ch){case '#':if(!StackEmpty(st)){pop(st);}break;case '@':clear(st);break;default:push(st,ch);}ch = getchar();}while(!StackEmpty(st)){ElemType e = GetTop(st);a[j++] = e;pop(st);}for(i = j-1;i>=0;i--){cout<<a[i];}cout<<endl;clear(st);}


测试函数

#include "Stack.h"void main(){Stack myStack;InitStack(&myStack);LineEdit(&myStack);}


函数采用单个字符判断的方法进行行编辑操作,操作简单,测试清除,故不进行执行截图。希望大家可以指出问题,谢谢。

0 0
原创粉丝点击