C语言学习 栈

一个受限的线性表数据结构,栈。

栈的定义:仅允许在表尾插入或者删除的线性表
栈的特点:先进后出或者后进先出
栈是线性表所以其存储结构也可分为顺序存储结构和链式存储结构

栈的存储结构

栈的顺序存储结构定义法

需要先知道栈的大小,定义后无法再改变栈的大小
在这里插入图片描述

栈的链式结构定义法

与链表类似
在这里插入图片描述

结构体的小知识

1.结构体定义时,不分配空间,例如上述的data[Max_Size]数组和变量top是不分配具体的内存,那什么时候才分配内存呢?
在定义结构体变量的时候内存才分配空间
SqStack Stack; 或者SqStack *r;

2.结构体变量的大小是根据结构体字节单位最大的数据类型所占字节计算的,通俗来说就是以最大的单位标准去衡量每一个数据,字节数不够的编译器自动补齐。例如:

typedef struct Stack
{
char a;
int b;
}SqStack;
我们直到char只占一个字节,int占4个字节,而结构体的大小是8字节,可以用sizeof()函数输出出来。
3.结构体作为函数参数,采取的是值传递方式,将结构体所占的所有单元全部传给形参,并且形参必须是同一类型的结构体变量,在使用的时候,形参会自动建立一个结构体变量
作为原结构体的副本,并且也要占据内存,且在调用期间如果修改形参结构体成员的值,
修改是无效的!!!!
但是指针作为实参,传递给形参,这时候产传递的是结构体地址,修改有效
下面是采用直接定义大小的栈的相关操作实现

void Init_Stack(SqStack *S)
{
(*S).top = -1;//初始化
}

int Push(SqStack* S, int data)
{
if ((*S).top == Max_Size - 1)
return 0;
(*S).data[++(*S).top] = data;
return 1;
}

int Pop(SqStack *S,int *tem)
{
if ((*S).top < 0)
return 0;
*tem = (*S).data[(*S).top–];
return 1;
}

void Print_Stack(SqStack *S)
{
int P = (*S).top;
for (;P>=0;)
{
printf(“Stack.data[%d]=[%d]\n”,P,(*S).data[P]);
P–;
}
}

运用栈的特点可以实现简单解决一些实际的问题
例如进制的转化,例如从键盘获得一个10进制的数,转换为8进制的数,并打印出来。
void main()
{
int data=0;
Init_Stack(&Stack);
scanf("%d", &data);
while (data)
{
Push(&Stack,data%8);
data = data / 8;
}
Print_Stack(&Stack);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值