| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1224 人关注过本帖
标题:看看出栈问题在哪里?~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
已结贴  问题点数:20 回复次数:9 
看看出栈问题在哪里?~
初学栈~出栈出问题了~帮忙看看~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<windows.h>
#include<conio.h>
#include<time.h>

#define stack_SIZE 20
#define  stack_add_SIZE 10

typedef struct STACK
{
    char* top;      //栈顶指针
    char* base;     //栈底指针
    int stacklen;   //栈长度
}STACK;

void initialization(STACK* s);   //初始化
void push(STACK* s,char e);      //入栈
void pop(STACK* s,char* e);      //出栈
void print();                    //获取当前栈元素

int stacklen(STACK* s);          //计算当前栈容量

void enpty(STACK *s);            //清空栈
void destroy(STACK* s);          //销毁栈

int main()
{
    int i=0;
    int len=0;

    char ch=0;

    STACK stack={0};

    srand((unsigned )time(NULL));

    initialization(&stack);

    puts("入栈示例:");

    len=rand()%50+5;

    for (i=0;i<len;++i)
    {
        ch=rand()%('z'-'a')+'a';
        push(&stack,ch);
        putchar(ch);
    }

    printf("\n该栈长度为:%d\n",len);

    puts("出栈示例:");

    while (stack.top!=stack.base)
    {
        pop(&stack,&ch);
        putchar(ch);
    }

    puts("");
    
    return 0;
}


void initialization(STACK* s)
{
    s->top=s->base=(char* )malloc(stack_SIZE*sizeof(char));//分配储存空间

    if (s->top==NULL)  //检查栈空间分配是否出错
    {
        puts("分配空间失败");
        exit(0);
    }

    s->stacklen=stack_SIZE;  //记录栈空间大小
}


void push(STACK* s,char e)
{
    if (s->stacklen==s->top-s->base) //检查是否栈满
    {
        s->base=(char* )realloc(s->base,(s->stacklen+stack_add_SIZE)*sizeof(char));//扩容
        s->stacklen+=stack_add_SIZE;     //这里要改变栈的长度
    }

    *s->top=e;
    ++s->top;
}

void pop(STACK* s,char* e)
{
    if (s->top==s->base)  //如果空栈就返回
        return ;

    *e=*--(s->top);
}

int stacklen(STACK* s)
{
    return (s->top-s->base);
}

void enpty(STACK* s)
{
    s->top=s->base;  //清空
}

void destroy(STACK* s)  
{
    free(s->base);

    s->base=NULL;
    s->top=NULL;
    s->stacklen=0;
}


[此贴子已经被作者于2017-3-6 23:30编辑过]

2017-03-06 21:06
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:1 
好像确实没问题啊

[此贴子已经被作者于2017-3-6 22:10编辑过]

2017-03-06 22:03
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
收藏
得分:1 
void pop(STACK* s,char* e)
{
    if (s->top==s->base)  //如果空栈就返回
        return ;
    *e=*--(s->top);
    改为
    *e = *((s--)->top);
}
2017-03-06 22:17
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
c4没有问题~但vc不行~提示while里面的条件没有成立而导致访问了额外的内存~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-07 08:59
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:1 
我看了半天没看懂你的栈是怎么运作的。

建栈要么用静态数组,要么用动态数组,要么用链表。

但似乎你的栈三个都不是。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-07 09:03
绿意盎然
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:47
专家分:60
注 册:2017-1-5
收藏
得分:1 
2017-03-07 09:47
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:8 
realloc 时 s->top 未置值,跟编译器没关系(不检查野指针读写的除外),



[fly]存在即是合理[/fly]
2017-03-07 09:50
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:8 
azzbcc版主一语中的!
realloc 函数会检查是否有连续空间,如果有则s-base指针不变,s->top指针不置值也可以,不是野指针,程序可正常执行,一旦没有连续空间,realloc 会申请一个改变大小后的连续空间,这时程序运行就会出错,简单验证办法是在initialization(&stack);语句后申请一个无用的空间,如下:
...
    initialization(&stack);
    char *p;
    p=(char* )malloc(stack_SIZE*sizeof(char));  //这样再也不会申请到连续空间了,这样realloc 会申请新空间并拷贝原空间内容,释放原空间
...

这样无论在什么编译器下程序都会运行出错!
push函数修改如下可正常:
void push(STACK* s,char e)
{
    unsigned long a;
    if (s->stacklen==s->top-s->base) //检查是否栈满
    {
        a=s->top-s->base;
        s->base=(char* )realloc(s->base,(s->stacklen+stack_add_SIZE)*sizeof(char));//扩容
        s->top=s->base+a;
        s->stacklen+=stack_add_SIZE;     //这里要改变栈的长度
    }
    *s->top=e;
    ++s->top;
}

个人感觉只要知道栈“先进后出”的特性,用头插方式的链表解决更简明,代码如下:

程序代码:
#include<stdio.h>
#include<stdlib.h>
struct stack
{
    char c;
    stack *next;
};
struct stack *push(struct stack *s,char c)
{//数据入栈
    struct stack *p;
    p=(struct stack*)malloc(sizeof(struct stack));
    p->c=c;
    p->next =s;
    return p;
}
char pop(struct stack **s)
{//数据出栈
    char c;
    if(*s==NULL)return 0;
    struct stack *p;
    c=(*s)->c;
    p=(*s)->next ;
    free(*s);
    *s=p;
    return c;
}
struct stack *destroy(struct stack *s)
{//清空栈
    struct stack *p;
    while(s)
    {
        p=s;
        s=s->next;
        free(p);
    }
    return s;
}

void main()
{
    char i;
    struct stack *sp=NULL;
    for(i='A';i<'Z';i++)
    {
        sp=push(sp,i);
        printf("%c ",i);
    }
    printf("\n");
    while(sp)
    {
        printf("%c ",pop(&sp));
    }
    printf("\n");
}


[此贴子已经被作者于2017-3-7 11:13编辑过]

2017-03-07 10:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
上面两位一针见血指出来问题所在~又学习到新东西了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-07 15:30
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
弄懂了~拜谢
~~~~~~~~~~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-07 17:35
快速回复:看看出栈问题在哪里?~
数据加载中...
 
   



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

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