顺序堆栈(数组)

本文介绍了一个简单的栈实现,包括创建、压栈、出栈等基本操作,并通过示例展示了如何使用这些函数。同时,文章指出在栈创建过程中常见的错误及其可能导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完成品代码:

#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);中却能够输出数据函数中定义的默认数据?






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值