栈的应用之-----行编辑程序

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREACE 10

typedef struct
{
    char *top;
    char *base;
    int stacksize;
}stack;

int main()
{
    // 创建栈
    void InitStack(stack *s);
    // 入栈
    void Push(stack *s, char e);
    // 出栈
    void Pop(stack *s);
    // 出栈并显示每一个出栈的字符
    char PopStack(stack *s);
    // 请空栈
    void ClearStack(stack *s);
    // 计算有效栈的长度,判断是否栈空
    int Top_Base(stack *s);

    // 定义
    stack s,s2;
    char temp;//暂时接受getchar()输入的字符
    char elemtemp;
    int length;

    InitStack(&s);
    // 输入一行直到按下回车结束行输入
    temp=getchar();
    while(temp != '\n')
    {
        // 判断temp是字符还是#还是@,选用switch结构
        switch(temp)
        {
            // 删除一个字符,即出栈一次
            case '#':Pop(&s);break;
            // 删除前面输入的一行,即请空栈
            case '@':ClearStack(&s);break;
            // 正确接受字符,即入栈一次
            default:Push(&s, temp);
        }
        temp = getchar();
    }
    // 输出应该正确显示的字符到屏幕:出栈->入新栈->再出栈  并显示输出
    InitStack(&s2);
    length = Top_Base(&s);
    while(length != 0)
    {
        elemtemp = PopStack(&s);
        Push(&s2, elemtemp);
        length = Top_Base(&s);
    }
    length = Top_Base(&s2);
    while(length !=0 )
    {
        elemtemp = PopStack(&s2);
        printf("%c",elemtemp);
        length = Top_Base(&s2);
    }
    return 0;
}

void InitStack(stack *s)
{
    s->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char *));
    s->top = s->base;
    s->stacksize = STACK_INIT_SIZE;
}

void Push(stack *s, char e)
{
    // 判断栈满,若栈满则扩充
    if(s->top - s->base == s->stacksize)
    {
        s->base = (char *)realloc(s->base, STACKINCREACE * sizeof(char));
        // 如果内存分配失败,则退出
        if(!s->base)
            exit(0);
        // 扩充成功修改栈指标
        s->top = s->base + s->stacksize;
        s->stacksize += STACKINCREACE;
    }
    *(s->top) = e;
    s->top++;
}

void Pop(stack *s)
{
    //若栈空,则退出
    if(s->base == s->top)
        exit(0);
    s->top = s->top - 1;
}

void ClearStack(stack *s)
{
    s->top = s->base;
}

char PopStack(stack *s)
{
    char e;
    e = *(s->top-1);
    s->top--;
    return e;
}

int Top_Base(stack *s)
{
    int length;
    length = s->top - s->base;
    return length;
}

总结:
1、循环输入:要先getchar()输入一次,判断是否是回车结束符,不是再读入内存并在此getchar()输入,直到回车
2、switch……case结构注意除default之外都要加break;
3、有多于一个栈的时候每次调用栈时要注意调用的是哪个栈,要细心!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值