程序都已经成功通过编译,运行无异常,如果你发现bug,请评论区留言,我们相互交流下经验。
定义:
栈是只能在一端进行数据的插入与删除的线性表。也可以理解为一种“先进后出”的存储结构。
按照内存生成的方式不同分为:
静态栈 动态栈
栈的几个概念:
- 允许进行插入、删除操作的一端称为栈顶。
- 表的另一端称为栈底。
- 当栈中没有数据元素时,称为空栈。
- 栈的插入操作通常称为进栈或入栈。
- 栈的删除操作通常称为退栈或出栈。
静态栈的代码如下:
1.静态栈 不用malloc函数
/*
生成的内存为连续内存
静态栈,当栈生成以后,长度已经定了 也就是一个数组,和一个栈顶元素(保存了,最后一个有效元素的位置)
这种程序结构并不推荐
top保存的为最后一个有效元素的地址
*/
# include <stdio.h>
# define Maxsize 10
/*
定义一个结构体变量
结构体变量有两部分1.是地址连续的数组内容 2.保存了最后那个元素的有效地址编号
*/
typedef struct Student
{
int data[Maxsize];
int top; //top始终为当前元素的位置
}SqStack;
//函数申明
bool TravalList(SqStack * s);
int PopStack(SqStack * s,int &val);
bool PushStack(SqStack * s,int val);
void InitStack(SqStack * s);
int main()
{
int val;
SqStack sq; //当这条语句写下以后,栈已经生成 内存已进行分配 在主函数main中进行
//生成一个结构体变量,操作系统并为之分配相应的内存,创建了一个数组+top的结构体,不用使用动态内存分配的malloc函数分配相应的内存
sq.top=-1; //设置栈顶元素为-1
PushStack(&sq,1); //压栈
PushStack(&sq,2);
PushStack(&sq,3);
PushStack(&sq,4);
PushStack(&sq,5);
PushStack(&sq,6); //压栈
PushStack(&sq,7);
PushStack(&sq,8);
PushStack(&sq,9);
PushStack(&sq,10);
PushStack(&sq,11);
TravalList(&sq);
PopStack(&sq,val);
printf("val = %d\n",val);
}
bool PushStack(SqStack * s,int val)
{
if(s->top == Maxsize-1)
{
printf("栈满\n");
return false;
}
else
{
s->top++;
s->data[s->top]=val;
return true;
}
}
int PopStack(SqStack * s,int &val)//弹栈 出栈
{
if(s->top == -1)
{
printf("栈空\n");
return 0;
}
else
{
val = s->data[s->top];
s->top--;
return val;
}
}
bool TravalList(SqStack * s)//遍历
{
int i;
if(s->top == -1)
{
printf("空栈\n");
return false;
}
else
{
for(i=0;i<=s->top;i++)
{
printf("%d ",s->data[i])