提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
数据结构:研究数据处理和数据存储的一门学科
线性表则是一种具有相同特性的数据元素的有限序列 除第一个节点外,所有的节点有且仅有一个前驱节点 除最后一个节点外,所有的节点有且仅有一个后驱节点
栈:先进后出(一种特殊的线性表)
提示:栈分为顺序栈和链栈,这里我们主要介绍顺序栈
一、栈是什么?
示例:栈是一个线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底
进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。
栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
栈的删除操作叫做出栈。出数据也在栈顶。
举几个例子应该会更好理解
如下图,如果我们以1,2,3,4压栈的话那出栈的顺序是什么呢 如下图,
那出栈的顺序就是4,3,2,1
当然在没有要求出栈顺序的情况下也可以随时操控数据出栈,比如说这里的压栈顺序是1,2,3,4但是出栈顺序也可以是1,2,3,4,可以将1刚压进去,就出来,2压进去再出来以此类推。
二、顺序栈
1.顺序栈的结构
代码如下(示例):
#define Max 100
#define ElementType int
typedef struct
{
ElementType arr[Max];
int len;
}Stack;
2.顺序栈的初始化
代码如下(示例):
void InitStack(Stack*s)
{
for (int i = 0; i < Max; i++)
{
s->arr[i]=0;
}
s->len=0;
}
3.顺序栈的遍历
代码如下(示例):
void Travel(Stack *s)
{
for (int i = 0; i < s->len; i++)
{
printf("%d",s->arr[i]);
}
printf("\n");
}
4.入栈
由于栈只能从尾部(栈顶)插入/删除元素,所以只用实现尾插/尾删功能
void Push(Stack*s,ElementType element)
{
if (s->len>=Max)
{
printf("栈满\n");
return;
}
s->arr[s->len++]=element;
}
5.入栈
由于栈只能从尾部(栈顶)插入/删除元素,所以只用实现尾插/尾删功能
void Pop(Stack*s)
{
if(s->len==0)
{
printf("栈空\n");
return;
}
s->len--;
}
6.得到栈顶元素
ElementType*GetTop(Stack*s)
{
if (s->len)
{
printf("栈空\n");
return NULL;
}
return &s->arr[s->len-1];
}
7.判断栈是否为空
bool IsStackEmpty(Stack*s)
{
return s->len==0;
}
三、 利用顺序栈做一个进制转化器
int num=0;
int n=0;
printf("请输入你要转换的数");
scanf("%d",&num);
printf("请输入你要转换的进制:");
scanf("%d",&n);
while (num!=0)
{
Push(&s,num%n);
num/=n;
}
while (IsStackEmpty(&s)==false)
{
printf("%c",*GetTop(&s));
Pop(&s);
}
printf("\n");
总结
提示:这里对文章进行总结:
以上就是今天要讲的内容,本文仅仅简单介绍了顺序栈的使用。