| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1298 人关注过本帖
标题:用栈实现行编辑程序-----检查没错,运行出错,大神帮忙看看
只看楼主 加入收藏
新手丶小方
Rank: 2
等 级:论坛游民
帖 子:16
专家分:18
注 册:2016-11-28
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:4 
用栈实现行编辑程序-----检查没错,运行出错,大神帮忙看看
/*用栈实现行编辑程序*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define STACK_SIZE 100
typedef struct
{
    char *base;
    char *top;
    int stacksize;
}SeqStack;

/*定义函数Initial(),实现构造栈 进栈 出栈 取栈顶元素 清空栈等 操作 */
void Initial(SeqStack *S)                              /*初始 化栈 */
{
    S->base=(char*)malloc(STACK_SIZE*sizeof(char));
    if(!S->base)
        exit(-1);
    S->top=S->base;
    S->stacksize=STACK_SIZE;
}
int IsEmpty(SeqStack*S)                                /*判断 栈空 */
{
    return S->top==S->top;
}
int IsFull(SeqStack*S)                                 /*判断 栈满 */
{
    return S->top-S->base==STACK_SIZE-1;
}
void Push(SeqStack *S,char x)                          /* 进     */
{
    if(IsFull(S))
    {
        printf("overflow");
        exit(1);
    }
    else
        *S->top++=x;   
}
void Pop(SeqStack *S)                                  /* 出     */   
{
    if(IsEmpty(S))
    {
        printf("NULL");
        exit(1);
    }
    else
        --S->top;
}
char Top(SeqStack *S)                                  /*取栈顶元素*/  
{
    if(IsEmpty(S))
    {
        printf("empty");
        exit(1);
    }
    return*(S->top-1);
}
void ClearStack(SeqStack*S)                            /*清空 栈   */
{
    S->top=S->base;
}

/*自定义函数LineEdit(),实现行编辑功能*/
void LineEdit(SeqStack *S)                   /*#号为退格符,为清空*/
{
    int i=0,a[100],n;/*定义变量数据为整型*/
    char ch;
    ch=getchar();    /*将输入字符赋给ch*/
    while(ch!='\n')
    {
        i++;         /*记录进栈元素个数*/
        switch(ch)   /*判断输入字符*/
        {
        case'#':   /*当输入字符为#时*/
            Pop(S);
            i-=2;  /*出栈 元素个数减少两个*/
            break;
        case'@':
            ClearStack(S);
            i=0;
            break;
        default:   /*元素不是#和@时,其余元素进行进栈操作*/   
            Push(S,ch);
        }
        ch=getchar();
    }
    for(n=1;n<=i;n++) /*将栈中元素存入数组中*/
    {
        a[n]=Top(S);
        Pop(S);
    }
    for(n=i;n<=1;n--)       /*将数组的元素输出*/
        printf("%c",a[n]);
}


/*main()函数作为程序的入口程序,调用LineEdit()函数实现简单的行编辑程序*/
void main()
{
    SeqStack *ST;
    printf("please input: \n");
    Initial(ST);
    LineEdit(ST);
}
搜索更多相关主题的帖子: include 元素 
2016-12-23 10:30
新手丶小方
Rank: 2
等 级:论坛游民
帖 子:16
专家分:18
注 册:2016-11-28
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
2016-12-23 10:32
musicwyr
Rank: 2
等 级:论坛游民
帖 子:3
专家分:14
注 册:2016-12-16
收藏
得分:10 
有两个错误:
1、判断栈空中修改为return S->top==S->base;
2、打印数组输出改为:for(n=i;n>=1;n--)       /*将数组的元素输出*/
                       printf("%c",a[n]);
2016-12-23 11:34
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
回复 2楼 新手丶小方
除了上楼指出的问题外,问题还有函数传参导致,这是头指针不声明为公有所带来的麻烦,得要用二重指针~(诶我用的是vc编译环境,C++可以引用,方便很多的)~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-24 05:00
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 楼主 新手丶小方
懒,把参数传递改了,这样只能适用于唯一栈~不过细看上面那些问题还是很多的,诶,我也是初学栈,也有什么改得不到位的地方~

程序代码:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define STACK_SIZE 100
#define CR (SeqStack*)malloc(sizeof (SeqStack))
typedef struct SeqStack
{
    char *base;
    char *top;
    int stacksize;
}SeqStack;
SeqStack *ST=NULL;
void Initial()
{
    ST=CR;

    if (ST==NULL)
        exit(-1);

    ST->base=(char *)malloc(STACK_SIZE*sizeof(char));

    if (ST->base==NULL)
        exit(-1);

    ST->top=ST->base;
        ++ST->top; //这里,由于top指向栈底时会断空,固这里要++;
}
int IsEmpty()                              
{
    return ST->top==ST->base;
}
int IsFull()                                 
{
    return ST->top-ST->base==STACK_SIZE-1;
}
void Push(char x)                         
{
    if(IsFull())
    {
        printf("overflow");
        exit(1);
    }
    else
        *ST->top++=x;
   
} 
void Pop()                                  /* 出  栈   */    
{
    if(IsEmpty())
    {
        printf("NULL");
        exit(1);
    }
    else
        --ST->top;
}
char Top()                                  /*取栈顶元素*/  
{
    if(IsEmpty())
    {
        printf("empty");
        exit(1);
    }
    return *ST->top;
}
void ClearStack()                            /*清空 栈   */
{
    ST->top=ST->base;
}

void LineEdit()                   
{
    int i=1,a[100],n;    //这里由于栈底元素不可取(取了断空),固i=1才能保证字符的完整性~
    char ch;
    ch=getchar();   

    while(ch!='\n')
    {
        i++;         /*记录进栈元素个数*/
        switch(ch)   /*判断输入字符*/
        {
        case'#':   /*当输入字符为#时*/
            Pop();
            i-=2;  /*出栈 元素个数减少两个*/
            break; 
        case'@':
            ClearStack();
            i=0;
            break;
        default:   /*元素不是#和@时,其余元素进行进栈操作*/   
            Push(ch);
        }
        ch=getchar();
    }
    for(n=1;n<=i;n++) /*将栈中元素存入数组中*/
    {
        a[n]=Top();
        Pop();
    }
    for(n=i;n>1;n--)       /*将数组的元素输出*/
        printf("%c",a[n]);
}

void main()
{
    printf("please input: \n");
    Initial();
    LineEdit();
    printf("\n");
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-24 05:50
快速回复:用栈实现行编辑程序-----检查没错,运行出错,大神帮忙看看
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029880 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved