关于线性表的一些总结——关于栈(1)

这几天刚结束了线性表中的学习,乘机总结一下

- 关于线性表

  1. 线性表是一种最常见的数据结构,通常运用都是它的特殊形式。例如栈、链表、队列等等。
  2. 一个线性表是n个具有相同特性的数据元素的有限序列。数据都是以一对一的关系存在。另外,线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。

- 关于主题——栈(stack)

栈是特殊的一种线性表,它的操作受到限制,只能在栈顶(表尾)进行插入与删除操作。通常分为链栈与顺序栈。

标准术语中插入元素称为进栈(入栈、压栈),删除元素叫做出栈。

栈的应用多用于:

  1. 函数调用、递归调用的处理

  2. parsing(语法分析——编译程序的设计等)

  3. reversing data(反转数据)

  4. 中序式(infix)与前缀式(prefix)与后缀式(postfix)的相互转化

(4.这一块在后面会重点讲)


基本算法与实现

其实虽说stl中存在进行过封装的函数可以直接调用(使用头文件#include进行使用),但还是得讲一讲我们弱小又可怜的手动操作。

毕竟实际开发中手动更常用,如果是搞竞赛的话就无所谓。(我们老师讲的,值得考究)

如果有dalao看见这句话请无视我这个蒟蒻。

其实stl用起来真的方便,但还是会产生依赖性。废话不多,进入基本操作。

用链栈进行举例(顺序栈可以自己搜一下,我笔记太乱了)


通过链式储存结构实现的栈称为链栈

提醒:一下代码需要了解指针才看到明白,如果没学还是自己搞一下。部分不懂语法自己度娘,我不一一解释了。

  1. 创建栈
typedef struct LNode
{
  
	ElemType data;
  
	struct LNode *next;
  
}*SLink;

//栈链定义结构

typedef struct

{
  SLink top;//栈顶指针

  int length;//栈中元素个数

}Stack;

  1. 栈链初始化
void InitStack(Stack &S)
  
{
  
	//构造一个空栈
  
	S.top=NULL;//设栈顶指针初值为空
  
	S.length=0;//空栈中元素个数为零
  
}

  1. 栈链的入栈
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
  
}


  1. 这个我自己代码掉了,借用度娘的,如果有错欢迎指正
LinkStack *Pop(LinkStack *top)
 
{
 
       LinkStack *p;
 
       if(!top)
 
       {
 
              printf("/n链栈是空的!");
 
              return NULL;
 
       }  //判断是否为空栈n
 
       p=top;  //指向被删除的栈顶
 
       top=top->next; //修改栈顶指针
 
       free(p);
 
       return top;
 
}

大致操作就这么多,还有其他的,但不常用就没打上来。

各位大佬如果发现有不足之处欢迎指出与交流,蒟蒻挥挥。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值