| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 822 人关注过本帖
标题:栈的应用的一个迷糊
只看楼主 加入收藏
真的很菜
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:94
专家分:151
注 册:2012-2-18
结帖率:71.43%
收藏
已结贴  问题点数:10 回复次数:10 
栈的应用的一个迷糊
刚才写了个关于栈的应用的代码:利用栈对用户输入的整数进行奇偶分类,可是出现了一个问题,运行后什么没看到就崩溃了,提示的警告是:D:\VC6.0\MSDev98\MyProjects\利用栈分类_1\利用栈分类_1.cpp(62) : warning C4700: local variable 's' used without having been initialized  到百度查理翻译说是主函数中的InitStack(s)函数的参数没有初始化,这要初始化为什么啊?请大侠指教。
程序代码:
#include<stdio.h>
#define MaxSize 100
typedef struct
{//定义栈,栈1和栈2共享空间
    int elements[MaxSize];
    int top1;                    //栈1栈顶指针,初始值为“0”
    int top2;                    //栈2栈顶指针,初始值为“MaxSize”
}BiStack;
void InitStack(BiStack *s)
{//建立空栈
    s->top1 = 0;
    s->top2 = MaxSize;
}
bool IsFull(BiStack s)
{//判断栈s是否为满,若为满则返回true ,否则返回false
    if(s.top1 == s.top2)return true;
    else return false;
}
bool IsEmpty(BiStack s)
{//判断栈s是否为空,若为空则返回true ,否则返回false
    if(s.top1 == 0 && s.top2 == MaxSize)return true;
    else return false ;
}
void Push(BiStack *s,int e)
{//进栈操作,元素e作为栈顶元素插入到栈中
    if(!IsFull(*s))
    {//判满
        if(e%2 == 0)
        {//如果输入的是偶数则进栈1,由共享空间的头部递增进栈
            s->elements[s->top1] = e;
            s->top1++;
        }
        else
        {//如果输入的是奇数则进栈2,从共享空间的尾部递减进栈
            s->top2--;
            s->elements[s->top2] = e;
        }
    }
    else printf("栈满!\n");
}
void Pop(BiStack *s,int tag)
{//出栈,用tag标记告诉s要输出的是栈1还是栈2,若tag=1,则输出的是栈1(即偶数);若tag=2 则输出栈2(即奇数)
    if(!IsEmpty(*s))
    {//判空
        if(tag == 1)
        {//tag=1,栈1出栈
            s->top1--;
            printf("%d\t",s->elements[s->top1]);
        }
        else
        {//tag=2,栈2出栈
            printf("%d\t",s->elements[s->top2]);
            s->top2++;
        }
    }
    else printf("栈空!\n");
}
int main()
{
    BiStack *s;  //定义一个BiStack 类的指针s
    int e,i;
    InitStack(s);//创建空栈
    printf("请输入10个整数:\t");
    for(i = 0;i < 10;i++)
    {//输入10个整数并把值放到栈里
        scanf("%d",&e);
        Push(s,e);
    }
    printf("分类后为:");
    for(i = 1;i <= 2;i++)
    {//利用for循环控制输出的是偶数还是奇数,这里的i传递给Pop(BiStack *s,int tag)函数中的tag标识
        if(i == 1)printf("偶数类:\t");
        else printf("奇数类:\t");
        while(s->top1 != 0 && s->top2 != MaxSize)
        {
            Pop(s,i);
        }
    }
    return 0;
}
搜索更多相关主题的帖子: 应用 
2012-10-22 23:35
真的很菜
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:94
专家分:151
注 册:2012-2-18
收藏
得分:0 
没人!
2012-10-23 15:01
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:0 
BiStack *s;  //定义一个BiStack 类的指针s

请问你的s指向哪里??
2012-10-23 15:05
真的很菜
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:94
专家分:151
注 册:2012-2-18
收藏
得分:0 
回复 3楼 newdos
我把它赋为NULL了,但还是不行
2012-10-23 22:25
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:5 
我倒,你赋为NULL就OK了么? 你代进函数看看:
void InitStack(BiStack *s)
{//建立空栈
    s->top1 = 0;
    s->top2 = MaxSize;
}

等效于
NULL->top1 = 0;
NULL->top2 = MaxSize;

很明显,你没有为BiStack类型的结构分配任何空间,
BiStack *s = (BiStack *)malloc(sizeof(BiStack));  //定义一个BiStack 类的指针s
又或是
BiStack bstack;
BiStack *s = &bstack;

MaxSize宏定义请全部使用大写规范, MAXSIZE 或者使用更好的定义式const int MaxSize = 100;
2012-10-24 12:05
babylco0
Rank: 2
等 级:论坛游民
威 望:1
帖 子:8
专家分:60
注 册:2012-10-18
收藏
得分:5 
程序代码:
#include<stdio.h>
#include <stdlib.h>
#define MaxSize 100
typedef struct
{//定义栈,栈1和栈2共享空间
    int elements[MaxSize];
    int top1;                    //栈1栈顶指针,初始值为“0”
    int top2;                    //栈2栈顶指针,初始值为“MaxSize”
}BiStack;
void InitStack(BiStack *s)
{//建立空栈
    s->top1 = 0;
    s->top2 = MaxSize;
}
bool IsFull(BiStack s)
{//判断栈s是否为满,若为满则返回true ,否则返回false
    if(s.top1 == s.top2)return true;
    else return false;
}
bool IsEmpty(BiStack s)
{//判断栈s是否为空,若为空则返回true ,否则返回false
    if(s.top1 == 0 && s.top2 == MaxSize)return true;
    else return false ;
}
void Push(BiStack *s,int e)
{//进栈操作,元素e作为栈顶元素插入到栈中
    if(!IsFull(*s))
    {//判满
        if(e%2 == 0)
        {//如果输入的是偶数则进栈1,由共享空间的头部递增进栈
            s->elements[s->top1] = e;
            s->top1++;
        }
        else
        {//如果输入的是奇数则进栈2,从共享空间的尾部递减进栈
            s->top2--;
            s->elements[s->top2] = e;
        }
    }
    else printf("栈满!\n");
}
void Pop(BiStack *s,int tag)
{//出栈,用tag标记告诉s要输出的是栈1还是栈2,若tag=1,则输出的是栈1(即偶数);若tag=2 则输出栈2(即奇数)
    if(!IsEmpty(*s))
    {//判空
        if(tag == 1)
        {//tag=1,栈1出栈
            s->top1--;
            printf("%d\t",s->elements[s->top1]);
        }
        else
        {//tag=2,栈2出栈
            printf("%d\t",s->elements[s->top2]);
            s->top2++;
        }
    }
    else printf("栈空!\n");
}
int main()
{
    BiStack s;  //定义一个BiStack 类的指针s
    BiStack *ps;
    ps = &s;
    int e,i;
    InitStack(ps);//创建空栈
    printf("请输入10个整数:\n");
    for(i = 0;i < 10;i++)
    {//输入10个整数并把值放到栈里
        scanf("%d",&e);
        Push(ps,e);
    }
    printf("分类后为:\n");
    for(i = 1;i <= 2;i++)
    {//利用for循环控制输出的是偶数还是奇数,这里的i传递给Pop(BiStack *s,int tag)函数中的tag标识
        if(i == 1)
        {
             printf("偶数类:\t");
             while(s.top1 != 0)
             {
                 Pop(ps,i);
             }
             printf("\n");
        }
        else
        {
            printf("奇数类:\t");
            while(s.top2 != MaxSize)
            {
            Pop(ps,i);
            }
            printf("\n");
        }
       
    }
    system("PAUSE");
    return 0;
}

修改下指针的赋值,另外你的输出函数也有问题,一并给你改正了。
2012-10-25 10:22
青春无限
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3451
专家分:19340
注 册:2012-3-31
收藏
得分:0 
须学习

学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能
2012-10-25 10:30
真的很菜
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:94
专家分:151
注 册:2012-2-18
收藏
得分:0 
额,万分感谢
2012-10-26 00:16
真的很菜
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:94
专家分:151
注 册:2012-2-18
收藏
得分:0 
回复 7楼 青春无限
好好学习
2012-10-26 12:41
真的很菜
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:94
专家分:151
注 册:2012-2-18
收藏
得分:0 
回复 6楼 babylco0
非常感谢,弄懂了
2012-10-26 12:42
快速回复:栈的应用的一个迷糊
数据加载中...
 
   



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

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