一.静态栈的缺陷
当存储的元素为类类型的时候,静态栈会的对象在创建的时候会多次调用元素类型的构造函数,影响效率,当使用原生数组作为存储空间,在创建创建栈的时候会调用泛指类型T的构造函数,当函数退出的时候又调用析构函数
1.1 测试代码
1 | c复制代码#include <iostream> |
结果为:
从结果来看,此时栈中没有任何元素,但是却调用了5次构造函数和析构函数
二.链式栈的实现
实际上就是单链表,定义一个top指针,始终指向链表的首元素,当入栈的时候将新结点的next指针指向top指针,并移动top指针,出栈的直接摧毁首结点即可
2.1 设计要点
- 抽象父类Stack的直接子类
- 在内部组合使用LinkList类,即链表类,实现栈的链式存储
- 只在单链表的头部进行操作
2.2 入栈
单链表的头插法
1 | c复制代码 void push(const T& e) |
2.3 出栈
移除下标为0的元素
1 | c复制代码 void pop() |
2.4 获取栈顶元素
1 | c复制代码 T top()const |
2.5 清空栈
1 | c复制代码 void clear() |
2.6 栈成员个数
1 | c复制代码 int size() |
三.完整代码
3.1 LinkList.h
1 | c复制代码#ifndef __LINK_LIST_ |
3.2 Stack.h
1 | c复制代码#ifndef STACK_H |
3.3 linkStack.h
1 | c复制代码#pragma once |
3.4 测试程序
1 | c复制代码#include <iostream> |
3.5 结果
从结果看到没有再调用构造函数
四:栈实践-符号检测
编译器是如何实现符号检测的呢,下面的实现思路
4.1 实现思路
- 从第一个字符开始扫描
- 当遇到普通字符则不管,遇到左符号则压栈,遇到右符号则弹出栈顶符号,并与右符号进行匹配
- 成功:所有的字符都扫描,且栈为空
- 失败:匹配失败且所有字符都扫描成功当栈为空
4.2 代码实现
1 | c复制代码#include <iostream> |
结果:
五.小结
- 栈后进先出的特性适合检测成对出现的符号
- 栈适合就近匹配的场合
本文转载自: 掘金