注册 登录
编程论坛 数据结构与算法

栈的应用的一个迷糊

真的很菜 发布于 2012-10-22 23:35, 822 次点击
刚才写了个关于栈的应用的代码:利用栈对用户输入的整数进行奇偶分类,可是出现了一个问题,运行后什么没看到就崩溃了,提示的警告是: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;
}
10 回复
#2
真的很菜2012-10-23 15:01
没人!
#3
newdos2012-10-23 15:05
BiStack *s;  //定义一个BiStack 类的指针s

请问你的s指向哪里??
#4
真的很菜2012-10-23 22:25
回复 3楼 newdos
我把它赋为NULL了,但还是不行
#5
newdos2012-10-24 12:05
我倒,你赋为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;
#6
babylco02012-10-25 10:22
程序代码:
#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;
}

修改下指针的赋值,另外你的输出函数也有问题,一并给你改正了。
#7
青春无限2012-10-25 10:30
须学习
#8
真的很菜2012-10-26 00:16
额,万分感谢
#9
真的很菜2012-10-26 12:41
回复 7楼 青春无限
好好学习
#10
真的很菜2012-10-26 12:42
回复 6楼 babylco0
非常感谢,弄懂了
#11
真的很菜2012-10-26 12:44
回复 5楼 newdos
恩恩,谢谢
1