堆栈顺序栈的运用。能不能在我给的基础上修改

/*设计一个简单的文字编辑器,使其具有删除打错字符的功能*/
/*约定:@表示删除前面一个字符,#表示删除前面所有字符,$表示编辑结束*/
#include
#define maxsize 64
typedef struct
{
void* data[maxsize];
int top;
}seqstack;

void SETNULL(seqstack *s){

s->top=-1;printf("cei1\n");printf("%d",s->top);

}

int EMPTY(seqstack *s){
printf("cei10\n");

if(s->top>=0)
    return 0;
else
    return 1;

}

char POP(seqstack *s)
{ printf("cei2\n");

if(EMPTY(s))
{
    printf("underflow");
    return NULL;}
else
{
    s->top--;
    return(s->data[s->top+1]);
}

}

seqstack *PUSH(seqstack *s,char x){
printf("cei3\n");

int i;
if(s->top==maxsize-1)
{
    printf("overflow");
    return NULL;
}
else
{

 s->top++;
  s->data[s->top]=x;
}
return s;

}

void shuchu(seqstack *s){
printf("cei4\n");

int i=-1;
printf("字符为\n");
while(i!=s->top){
    printf("%s\t",s->data[i+1]);
    i++;
}

}

void EDIT(seqstack *s)
{
char c;

SETNULL(&s);    printf("cei5\n");

c=getchar();

while(c!='$')
{

    if(c=='@') {
        POP(&s);    printf("cei6\n");

    }
    else if(c=='#') {
            SETNULL(&s);    printf("cei7\n");

    }
    else {printf("1%d",s->top);
            PUSH(&s,c);    printf("cei8\n");

    }
    getchar();
    shuchu(&s);    printf("cei9\n");

    c=getchar();

}

}

void main()
{

seqstack *s;
EDIT(s);

}

3个回答

改动可以实现功能:
你打log的代码没有删掉

/*设计一个简单的文字编辑器,使其具有删除打错字符的功能*/
/*约定:@表示删除前面一个字符,#表示删除前面所有字符,$表示编辑结束*/
#include <stdio.h>

#define maxsize 64
typedef struct
{
    char data[maxsize];
    int top;
}seqstack;
void SETNULL(seqstack *s) {
    s->top = -1; printf("cei1\n"); printf("%d", s->top);
}
int EMPTY(seqstack *s) {
    printf("cei10\n");
    if (s->top >= 0)
        return 0;
    else
        return 1;
}
char POP(seqstack *s)
{
    printf("cei2\n");
    if (EMPTY(s))
    {
        printf("underflow");
        return NULL;
    }
    else
    {
        return s->data[s->top--];
    }
}
seqstack *PUSH(seqstack *s, char x) {
    printf("cei3\n");
    int i;
    if (s->top == maxsize - 1)
    {
        printf("overflow");
        return NULL;
    }
    else
    {

        s->top++;
        s->data[s->top] = x;
    }
    return s;
}
void shuchu(seqstack *s) {
    printf("cei4\n");
    int i = -1;
    printf("字符为\n");
    while (i != s->top) {
        printf("%c", s->data[i + 1]);
        i++;
    }
    printf("\n");
}
void EDIT(seqstack *s)
{
    char c;
    SETNULL(s);    printf("cei5\n");

    c = getchar();

    while (c != '$')
    {

        if (c == '@') {
            POP(s);    printf("cei6\n");

        }
        else if (c == '#') {
            SETNULL(s);    printf("cei7\n");

        }
        else {
            printf("1%d\n", s->top);
            PUSH(s, c);    printf("cei8\n");

        }
        getchar();
        shuchu(s);    printf("cei9\n");

        c = getchar();

    }
}
void main()
{
    seqstack *s = new seqstack;
    EDIT(s);
} 
s_listening
s_listening 回复qq_39226270: 并且我重构也不会是C,只会是C++
3 年多之前 回复
s_listening
s_listening 回复qq_39226270: :-;估计是不行的,备考期末o_0
3 年多之前 回复
qq_39226270
qq_39226270 回复s_listening: 好吧,大腿,能帮我写个新的吗
3 年多之前 回复
qq_39226270
qq_39226270 回复s_listening: 能再改改吗
3 年多之前 回复
s_listening
s_listening 回复qq_39226270: 那用char不行的(汉字两个字节),按照你原始的想法,输出时printf("%s");必须在每个data项后面添加'\0'。这样的话,你代码的基本框架肯定不在了,因为基本上是新任务了。
3 年多之前 回复
s_listening
s_listening 回复qq_39226270: 尝试使用void* 会导致每次push需要malloc等,pop或者清空是要一个一个的释放内存
3 年多之前 回复
qq_39226270
qq_39226270 回复s_listening: 最好能输入输出汉子
3 年多之前 回复
qq_39226270
qq_39226270 回复s_listening: 大神求带啊
3 年多之前 回复
s_listening
s_listening 回复qq_39226270: 那赋值语句就不能直接等于,要赋值指针了。里面的PUSH等函数都会有内存泄露的
3 年多之前 回复
qq_39226270
qq_39226270 回复s_listening: 我在结构体里用void*就是为了这个
3 年多之前 回复
qq_39226270
qq_39226270 回复s_listening:这个只能输入字符型和整型,可以改成可以输入输出更多类型吗
3 年多之前 回复
s_listening
s_listening 回复qq_39226270: 如果你要更考虑安全性,我那里申请内存的大小是有问题的,应该是sizeof(int)*(maxsize+1)
3 年多之前 回复
qq_39226270
qq_39226270 回复s_listening: 谢谢
3 年多之前 回复
s_listening
s_listening 回复qq_39226270: 改成c风格了,注意我加了头文件,都是c风格的。malloc的用法也许有问题(应该没错),我前面的写法忘记释放内存了
3 年多之前 回复
qq_39226270
qq_39226270 回复s_listening: 那改成C++文件?
3 年多之前 回复
s_listening
s_listening 回复qq_39226270: /*你需要改为使用malloc*/ seqstack *s;s=(seqstack *)malloc(4*maxsize+4)
3 年多之前 回复
s_listening
s_listening 回复qq_39226270: 我这里用了new操作符,c里面没有
3 年多之前 回复
s_listening
s_listening 回复qq_39226270: 啥报错?
3 年多之前 回复
qq_39226270
qq_39226270 回复s_listening: 我用了code blocks,编译有错
3 年多之前 回复
s_listening
s_listening 回复qq_39226270: 啥?我编程用的IDE是visual studio ,有时候用文本编辑器sublime
3 年多之前 回复
qq_39226270
qq_39226270 请问你用的那个软件
3 年多之前 回复
s_listening
s_listening 对比你的代码可以看下我改了些啥地方。 可以就采纳吧,愿意付费也欢迎o_O
3 年多之前 回复

话说贴代码好好贴不行啊 头文件被吞了,复制都不好复制。

s_listening
s_listening 回复qq_39226270: 修改好了,我又回答了一次
3 年多之前 回复
s_listening
s_listening 回复qq_39226270: 你里面到处是内存泄露。。
3 年多之前 回复
s_listening
s_listening 回复qq_39226270: 头文件改成C的也可以,没改主体结构,仍然是你的风格
3 年多之前 回复
qq_39226270
qq_39226270 回复s_listening: 我没学过C++,而且这个最近要交
3 年多之前 回复
qq_39226270
qq_39226270 回复s_listening: 不能只用c吗
3 年多之前 回复
s_listening
s_listening 回复qq_39226270: 我头文件写成了C++的,现在在测试
3 年多之前 回复
qq_39226270
qq_39226270 不管这个,能改吗
3 年多之前 回复

改成C风格的申请释放内存了
刚刚我的忘记释放内存了。
malloc我不熟悉,应该没写错。你可以找找看博客

/*设计一个简单的文字编辑器,使其具有删除打错字符的功能*/
/*约定:@表示删除前面一个字符,#表示删除前面所有字符,$表示编辑结束*/
#include <stdio.h>
#include <stdlib.h>

#define maxsize 64
typedef struct
{
    char data[maxsize];
    int top;
}seqstack;
void SETNULL(seqstack *s) {
    s->top = -1; printf("cei1\n"); printf("%d", s->top);
}
int EMPTY(seqstack *s) {
    printf("cei10\n");
    if (s->top >= 0)
        return 0;
    else
        return 1;
}
char POP(seqstack *s)
{
    printf("cei2\n");
    if (EMPTY(s))
    {
        printf("underflow");
        return NULL;
    }
    else
    {
        return s->data[s->top--];
    }
}
seqstack *PUSH(seqstack *s, char x) {
    printf("cei3\n");
    int i;
    if (s->top == maxsize - 1)
    {
        printf("overflow");
        return NULL;
    }
    else
    {

        s->top++;
        s->data[s->top] = x;
    }
    return s;
}
void shuchu(seqstack *s) {
    printf("cei4\n");
    int i = -1;
    printf("字符为\n");
    while (i != s->top) {
        printf("%c", s->data[i + 1]);
        i++;
    }
    printf("\n");
}
void EDIT(seqstack *s)
{
    char c;
    SETNULL(s);    printf("cei5\n");

    c = getchar();

    while (c != '$')
    {

        if (c == '@') {
            POP(s);    printf("cei6\n");

        }
        else if (c == '#') {
            SETNULL(s);    printf("cei7\n");

        }
        else {
            printf("1%d\n", s->top);
            PUSH(s, c);    printf("cei8\n");

        }
        getchar();
        shuchu(s);    printf("cei9\n");

        c = getchar();

    }
}
void main()
{
    seqstack *s; 
    s = (seqstack *)malloc(4 * maxsize + 4);
    EDIT(s);
    free(s);
} 
立即提问