这几天刚结束了线性表中的学习,乘机总结一下
- 关于线性表
- 线性表是一种最常见的数据结构,通常运用都是它的特殊形式。例如栈、链表、队列等等。
- 一个线性表是n个具有相同特性的数据元素的有限序列。数据都是以一对一的关系存在。另外,线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。
- 关于主题——栈(stack)
栈是特殊的一种线性表,它的操作受到限制,只能在栈顶(表尾)进行插入与删除操作。通常分为链栈与顺序栈。
标准术语中插入元素称为进栈(入栈、压栈),删除元素叫做出栈。
栈的应用多用于:
-
函数调用、递归调用的处理
-
parsing(语法分析——编译程序的设计等)
-
reversing data(反转数据)
-
中序式(infix)与前缀式(prefix)与后缀式(postfix)的相互转化
(4.这一块在后面会重点讲)
基本算法与实现
其实虽说stl中存在进行过封装的函数可以直接调用(使用头文件#include进行使用),但还是得讲一讲我们弱小又可怜的手动操作。
毕竟实际开发中手动更常用,如果是搞竞赛的话就无所谓。(我们老师讲的,值得考究)
如果有dalao看见这句话请无视我这个蒟蒻。
其实stl用起来真的方便,但还是会产生依赖性。废话不多,进入基本操作。
用链栈进行举例(顺序栈可以自己搜一下,我笔记太乱了)
通过链式储存结构实现的栈称为链栈
提醒:一下代码需要了解指针才看到明白,如果没学还是自己搞一下。部分不懂语法自己度娘,我不一一解释了。
- 创建栈
typedef struct LNode
{
ElemType data;
struct LNode *next;
}*SLink;
//栈链定义结构
typedef struct
{
SLink top;//栈顶指针
int length;//栈中元素个数
}Stack;
- 栈链初始化
void InitStack(Stack &S)
{
//构造一个空栈
S.top=NULL;//设栈顶指针初值为空
S.length=0;//空栈中元素个数为零
}
- 栈链的入栈
void Push(Stack &S,ElemType e)
{
//在栈顶之上插入元素e为新的栈顶元素
p=new LNode;//建立新的结点
if(!p) exit(1);//储存分配失败
p->data=e;
p->next=S.top;//链接到原来的栈顶
S.top=p;//移动栈顶指针
++S.length;//栈长度增1
}
- 这个我自己代码掉了,借用度娘的,如果有错欢迎指正
LinkStack *Pop(LinkStack *top)
{
LinkStack *p;
if(!top)
{
printf("/n链栈是空的!");
return NULL;
} //判断是否为空栈n
p=top; //指向被删除的栈顶
top=top->next; //修改栈顶指针
free(p);
return top;
}
大致操作就这么多,还有其他的,但不常用就没打上来。
各位大佬如果发现有不足之处欢迎指出与交流,蒟蒻挥挥。