顺序堆栈(数组)

来源:互联网 发布:电梯运行优化 编辑:程序博客网 时间:2024/06/06 05:01

完成品代码:

#include<stdio.h>

#include<stdlib.h>
typedef struct Stack * SNode;
struct Stack {
int *Data;           //储存数据的数组
int Top;               //指针当前停留位置
int MaxSize; //数组最大值
};
SNode CreateStack(int MaxSize);       //创建堆栈函数
bool IsFull(SNode S);                   //检查栈是否满
bool Push(int data1, SNode S);           //将data1数据压入堆栈
bool IsEmpty(SNode S);                //判断是否为空函数
int Pop(SNode S);              //出栈函数
int main()
{
SNode S;
S = CreateStack(10);
printf("%d %d\n", S->Top, S->MaxSize);
if (!IsFull(S)) printf("栈未满\n");
while (!IsFull(S))
{
int data;
scanf("%d", &data);
Push(data, S);
}
while (!IsEmpty(S))
{
int data = Pop(S);
if (data)  printf("出栈:%d\n", data);
}
return 0;
}


SNode CreateStack(int MaxSize)
{


SNode S;               //一个堆栈结构
S = (SNode)malloc(sizeof(struct Stack));
S->MaxSize = MaxSize;          //赋予最大值
S->Top = -1;                      //赋予数组指针头为-1
S->Data = (int *)malloc(sizeof(MaxSize)*MaxSize);          //为数组分配空间
return S;
}








bool IsFull(SNode S)
{
if (S->Top == S->MaxSize - 1) return true;
else return false;
}


bool Push(int data1, SNode S)
{
if (IsFull(S))
{
printf("栈已满 入栈失败:%d\n", data1);
system("pause");
return false;
}
S->Top++;
S->Data[S->Top] = data1;
return true;
}


bool IsEmpty(SNode S)
{
if (S->Top == -1) return true;
else return false;
}


int Pop(SNode S)              //出栈函数
{
if (IsEmpty(S))
{
printf("栈为空\n");
return 0;
}
int data1;
data1 = S->Data[S->Top--];
return data1;
}





VS编译环境下出现问题代码:


问题函数1:


bool IsFull(SNode S)
{
if (S->Top == S->MaxSize) return true;
else return false;

}


此时if语句不成立,函数却返回true

问题函数1没有问题,问题出在问题函数2中定义了返回了一个函数内局部变量的值,结果被销毁,使指针指向的值中S->Top=S->MaxSize


问题函数2:

SNode CreateStack(int MaxSize)
{
struct Stack S;               //一个堆栈结构
S.MaxSize = MaxSize;          //赋予最大值
S.Top = -1;                      //赋予数组指针头为-1
S.Data = (int *)malloc(sizeof(MaxSize)*MaxSize);          //为数组分配空间
return &S;
}

创建函数直接申明了一个局部变量堆栈结构,在函数结束后直接被销毁,但在结束后的main函数中的

printf("%d %d\n", S->Top,S->MaxSize);中却能够输出数据函数中定义的默认数据?






原创粉丝点击