栈结构:先进后出,后进先出,像叠盘子一样,先叠的后用。
代码github地址 https://github.com/hitskyer/course/tree/master/dataAlgorithm/chenmingming/stack

1.顺序栈(数组存储,需给定数组大小,到达容量需要copy转移数据)

1.1 头文件 arrStack.h

//
// Created by mingm on 2019/3/27.
//
#ifndef STACK_ARRSTACK_H
#define STACK_ARRSTACK_H
typedef unsigned int UINT;
template <class T>
class arrStack
{public:arrStack(int capacity);       // 初始化栈~arrStack(void);      // 析构栈bool Empty() const;       // 判断是否为空bool IsFull() const;    //判断栈是否满了void Clear();     // 则清空栈T& GetTop() const; // 得到栈顶元素UINT GetLength() const;    // 返回栈的长度void Push(T &data);    //往栈中压入数据void Expand();  //栈扩容void Pop();       //将栈顶数据弹出void print();   //自己加的接口,打印输出stack内容
private:int m_pTop;    // 栈顶指针UINT m_nStackLen;  // 栈容量T* arr; //数组arr
};#endif //STACK_ARRSTACK_H

1.2 类实现文件 arrStack.cpp

//
// Created by mingm on 2019/3/27.
//
#include "arrStack.h"
#include <iostream>
using namespace std;
template <class T> arrStack<T>::arrStack(int capacity):m_pTop(-1),m_nStackLen(capacity)
{arr = new T[capacity];
}
template <class T> arrStack<T>::~arrStack()
{Clear();delete [] arr;arr = NULL;
}
template <class T> bool arrStack<T>::Empty() const
{return m_pTop == -1;
}
template <class T> bool arrStack<T>::IsFull() const
{return m_pTop == m_nStackLen - 1;
}
template <class T> void arrStack<T>::Clear()
{m_pTop = -1;
}
template <class T> void arrStack<T>::Push(T &data)
{if(IsFull()){//        cout << "overflow !" << endl;Expand();}arr[++m_pTop] = data;
}
template <class T> void arrStack<T>::Expand()
{m_nStackLen = 2 * m_nStackLen;T* temparr = new T[m_nStackLen];for(int i = 0; i <= m_pTop; ++i){temparr[i] = arr[i];}T* temp = arr;arr = temparr;temparr = temp;delete [] temparr;temparr = NULL;
}
template <class T> void arrStack<T>::Pop()
{if(!Empty())--m_pTop;
}
template <class T> T& arrStack<T>::GetTop() const
{if(!Empty())return arr[m_pTop];throw "no elem!";   //抛出异常
}
template <class T> UINT arrStack<T>::GetLength() const
{return m_nStackLen;
}
template <class T> void arrStack<T>::print()
{cout << "----arrstack top----" << endl;int i = m_pTop, j = m_pTop;while(m_pTop != -1 && j >= 0){cout << "No." << i-- << " elem " << arr[j--] << endl;}cout << "----arrstack bottom----" << endl;
}

1.3 测试程序及括号格式合法性检测 arrstack_testMain.cpp(练习了下try,catch)

//
// Created by mingm on 2019/3/27.
//
#include "arrStack.cpp"
#include <string>
#include <iostream>
using namespace std;
int main()
{for(int i = 0; i < 20; ++i){int k = 0;arrStack<int> int_arr_stack(8);int_arr_stack.print();cout << "the capacity of stack is " << int_arr_stack.GetLength() << endl;while(k < i){int_arr_stack.Push(k);++k;}try{cout << "top elem is " << int_arr_stack.GetTop() << endl;}catch(const char* str){cout << str << endl;}cout << "the capacity of stack is " << int_arr_stack.GetLength() << endl;int_arr_stack.print();int_arr_stack.Clear();cout << "---------------------------------" << endl;}cout << "以下测试一个字符串是否有非法格式的括号" << endl;char conti = 'y', str;while(conti == 'y'|| conti == 'Y'){bool legal = true;arrStack<char> charstack(100);cout << "please enter a string to check its brackets legal or not !" << endl;while(cin.get(str) && str != '\n')  //不断地获取输入的字符{if(str == '{' || str == '[' || str == '(')  //遇到左括号不断地压栈{charstack.Push(str);continue;}switch(str) //遇到非左括号{case '}':try{if(charstack.GetTop()  && charstack.GetTop() == '{')   //栈不为空且栈顶与右括号匹配charstack.Pop();    //删除左括号elselegal = false;  //直接遇上右括号,非法;or 栈顶与当前右括号不匹配}catch(const char* str)  //若捕获try内的异常,没有元素在栈内,则遇到右括号,非法{legal = false;}break;case ']':try{if(charstack.GetTop() && charstack.GetTop() == '[')charstack.Pop();elselegal = false;}catch(const char* str){legal = false;}break;case ')':try{if(charstack.GetTop() && charstack.GetTop() == '(')charstack.Pop();elselegal = false;}catch(const char* str){legal = false;}break;default:break;}if(!legal)break;  //如果非法,不必循环了,直接退出}if(legal && charstack.Empty())  //如果合法,且符号都匹配了(栈为空)cout << "legal string !" << endl;else{cout << "illegal string !" << endl;cin.ignore(10000,'\n'); //清除非法字符后面尚未get的字符}cout << "continue? y/n: " ;cin >> conti;cin.get();}return 0;
}

2.链式栈(链表存储,无需给定长度)

2.1 头文件 stack.h

/*
* 概述:  栈
* 作者:  dongyaxing
* 版本:  1.0
* 创建时间:2019/3/25   20:47
* 修改者: liuyanfu
* 修改时间: 2019/3/25   21:14
*/
#ifndef _STACK_H
#define _STACK_H
template <class T>
struct SNode
{T data;SNode *pNext;
};
template <class T>using StackNode = SNode<T>* ;    //某些编译器不支持改语法
//template <class T> typedef SNode<T>* StackNode;   //错误写法
typedef unsigned int UINT;
template <class T>
class Stack
{public:Stack(void);      // 初始化栈~Stack(void);     // 析构栈bool Empty() const;       // 判断是否为空void Clear();     // 则清空栈StackNode<T> GetTop() const;   // 得到栈顶元素UINT GetLength() const;    // 返回栈的长度void Push(T &data);    //往栈中压入数据void Pop();       //将栈顶数据弹出void print();   //自己加的接口,打印输出stack内容
private:StackNode<T> m_pTop;   // 栈顶元素UINT m_nStackLen;  // 栈长度
};#endif  //_STACK_H

2.2 类实现文件 stack.cpp

//
// Created by mingm on 2019/3/26.
//
#include "stack.h"
#include <iostream>
using namespace std;
template <class T> Stack<T>::Stack():m_pTop(NULL),m_nStackLen(0){}
template <class T> Stack<T>::~Stack() {   Clear();    }
template <class T> bool Stack<T>::Empty() const
{return m_nStackLen == 0;
}
template <class T> void Stack<T>::Clear()
{while(m_pTop != NULL){Pop();}
}
template <class T> void Stack<T>::Push(T &data)
{StackNode<T> newNode = new SNode<T>;newNode->data = data;newNode->pNext = NULL;if(m_pTop == NULL){m_pTop = newNode;}else{newNode->pNext = m_pTop;m_pTop = newNode;}m_nStackLen++;
}
template <class T> void Stack<T>::Pop()
{if(m_pTop != NULL){StackNode<T> temp = m_pTop->pNext;delete m_pTop;m_pTop = temp;m_nStackLen--;}
}
template <class T> StackNode<T> Stack<T>::GetTop() const
{return m_pTop;
}
template <class T> UINT Stack<T>::GetLength() const
{return m_nStackLen;
}
template <class T> void Stack<T>::print()
{cout << "----stack top----" << endl;StackNode<T> temp = m_pTop;size_t i = 0;while(temp != NULL){cout << "No." << ++i << " elem " << temp->data << endl;temp = temp->pNext;}cout << "----stack bottom----" << endl;
}

2.3 链式栈 测试主程序

#include "stack.cpp"
#include <string>
#include <iostream>using namespace std;
int main()
{for(int i = 0; i < 10; ++i){int nums = 0;Stack<int> intstack;if(intstack.Empty())cout << "intstack is empty!" << endl;cout << "after push nums: " << endl;while(nums < i){intstack.Push(nums);nums++;}intstack.print();intstack.Pop();cout << "len of stack is " << intstack.GetLength() << endl;if(intstack.GetTop())cout << "top elem is " << intstack.GetTop()->data << endl;if(!intstack.Empty())cout << "intstack is not empty!" << endl;intstack.print();cout << "---------------------------------" << endl;}cout << "以下测试一个字符串是否有非法格式的括号" << endl;char conti = 'y', str;while(conti == 'y'|| conti == 'Y'){bool legal = true;Stack<char> charstack;cout << "please enter a string to check its brackets legal or not !" << endl;while(cin.get(str) && str != '\n')  //不断地获取输入的字符{if(str == '{' || str == '[' || str == '(')  //遇到左括号不断地压栈{charstack.Push(str);continue;}switch(str) //遇到非左括号{case '}':if(charstack.GetTop() && charstack.GetTop()->data == '{')   //栈不为空且栈顶与右括号匹配charstack.Pop();    //删除左括号elselegal = false;  //直接遇上右括号,非法;or 栈顶与当前右括号不匹配break;case ']':if(charstack.GetTop() && charstack.GetTop()->data == '[')charstack.Pop();elselegal = false;break;case ')':if(charstack.GetTop() && charstack.GetTop()->data == '(')charstack.Pop();elselegal = false;break;default:break;}if(!legal)break;  //如果非法,不必循环了,直接退出}if(legal && charstack.Empty())  //如果合法,且符号都匹配了(栈为空)cout << "legal string !" << endl;else{cout << "illegal string !" << endl;cin.ignore(10000,'\n'); //清除非法字符后面尚未get的字符}cout << "continue? y/n: " ;cin >> conti;cin.get();}return 0;
}

3.valgrind测试正确

数据结构--栈--顺序栈/链式栈(附: 字符括号合法配对检测)相关推荐

  1. 【数据结构】栈-顺序栈、链式栈、共享栈

    栈的定义 栈(Stack):只允许在一端进行插入或删除操作的线性表 栈顶(Top):线性表允许进行插入和删除的那一端. 栈底(Bottom):固定的,不允许进行插入和删除的另一端. Tips: 1.栈 ...

  2. 数据结构 创建顺序栈

    3.27数据结构--创建顺序栈 结构体定义 初始化栈 入栈 出栈 销毁栈 运行结果截图: 代码: /*3.27 顺序栈*/#define _CRT_SECURE_NO_WARNINGS #define ...

  3. c语言堆栈基本代码入栈出栈_C语言实现常用数据结构:栈-顺序栈实现(第6篇)...

    栈 栈是一种特殊的线性表,其特性是仅能在表尾进行插入或删除的操作,栈中元素的操作是按照后进先出的原则进行,因此栈又称为后进先出线性表(Last In First Out,LIFO数据结构).栈顶:表尾 ...

  4. 数据结构遍历顺序栈_数据结构:顺序栈的实现

    数据结构:顺序栈的实现 1.快速开始 栈是一种遵循元素后进(Push)先出(Pop)规则的线性表,即最后加入的元素最先出来,它的实现可以用数组或者链表. 它的特点如下: 后入先出,先入后出. 除了头尾 ...

  5. 数据结构:顺序栈基本操作(入栈和出栈)C语言详解(转载)by解学武

    本文为解学武教程的免费章节 什么是顺序栈 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如 ...

  6. 栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)

    文章目录 实现 顺序栈实现 链式栈实现 应用 函数栈 的应用 表达式求值中 的应用 括号匹配中 的应用 我们使用浏览器的时候经常会用到前进.后退功能. 依次访问完一串页面 a – b – c之后点击后 ...

  7. 【C++】【数据结构】顺序栈的基本操作(初始化、入栈、出栈、取栈顶元素、遍历输出栈)的算法实现附全代码

    C++实现顺序栈的算法+步骤(附全代码): 使用c++完成数据结构顺序栈的基本操作,包括(初始化.入栈.出栈.取栈顶元素.遍历输出栈等),可直接编译运行. 顺序栈的定义如下: #define MAXS ...

  8. 基于Python的数据结构实验——顺序栈与链栈建立与操作(附详细代码和注释)

    1.创建名为 prac03_01.py 的文件,在其中编写一个顺序栈的类,该类必须包含顺序栈 的定义及基本操作,并通过以下步骤测试基本操作的实现是否正确,给出运行结果. (1)初始化一个顺序栈 Seq ...

  9. 数据结构《顺序栈》知识点详解+C语言完整代码-超详细

    顺序栈 栈 1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式 C语言代码实现 1. 顺序栈的表示 2. 结构体 3.初始化 4.入栈 5.出栈 6. 取栈顶元素 7.求长 8 ...

最新文章

  1. React Hook基本使用踩坑指南
  2. ckeditor5加字数_ckeditor字数限制
  3. 【转】基于DCMTK的DICOM相关程序编写攻略
  4. C#多线程学习1——多线程的相关概念
  5. java设置登录超时时间设置_session超时时间设置方法
  6. 矩形窗、汉明窗效果对比(matlab)
  7. 光伏窗性能研究(2)——光伏窗性能研究方法和过程
  8. python学习之——假人配对
  9. 小白量化《穿云箭集群量化》(1)小白草根超级量化软件介绍
  10. OpenCv视频读与存
  11. CREO:CREO软件之零件【工具(调查/模型意图/实用工具)】、【视图(可见性/方向/模型显示/显示/窗口)】的简介及其使用方法(图文教程)之详细攻略
  12. 在web上面显示地图并定位
  13. android 短信发件箱,android将发送短信写入发件箱
  14. Arduino Mega2560 PWM
  15. 【Android】音乐播放器APP的设计与实现
  16. python跑酷游戏源码_HTML5游戏实战(1):50行代码实现正面跑酷游戏
  17. 关于fancybox打开动态加载的图片
  18. scala 中缀表达式和中置操作符
  19. 0035【Python】小白学习Python大纲
  20. 【Java基础】UML类图及各种线代表的关系含义总结

热门文章

  1. c语言结构体中整形数组初始化,c – 将{0,0}在结构体中初始化数组?
  2. 从源码到可执行程序的步骤
  3. matlab中关于@的作用(函数表达式句柄)
  4. Linux下WPS自主设置快捷键,电脑wps的word怎么自主设定快捷键
  5. 2019春季第三次编程总结
  6. django使用用户名或手机号码登录
  7. 缓存优化过程中的一些思考
  8. Simple IOCP Server代码解读
  9. skiplist原理与实现
  10. 反馈电路中相位补偿,到底是什么鬼?