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

栈结构:先进后出,后进先出,像叠盘子一样,先叠的后用。
代码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测试正确

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银行计考试-计算机考点2-计算机系统组成与基本工作原理

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/sinat_33363493/article/details/53647129 </div><link rel"stylesheet" href"https://csdnimg.cn/release/pho…

我们的实践: 400万全行业动态事理图谱Demo

历史经验知识在未来预测的应用 华尔街的独角兽Kensho&#xff0c;是智能金融Fintech的一个不得不提的成功案例&#xff0c;这个由高盛领投的6280万美元投资&#xff0c;总融资高达7280万美元的公司自推出后便名声大噪。Warren是kensho是一个代表产品&#xff0c;用户能够以通俗…

蚂蚁花呗团队面试题:LinkedHashMap+SpringCloud+线程锁+分布式

一面 自我介绍 map怎么实现hashcode和equals,为什么重写equals必须重写hashcode 使用过concurrent包下的哪些类&#xff0c;使用场景等等。 concurrentHashMap怎么实现&#xff1f;concurrenthashmap在1.8和1.7里面有什么区别 CountDownLatch、LinkedHashMap、AQS实现原理 …

肖仰华 | SIGIR 2018、WWW2018 知识图谱研究综述

本文转载自公众号&#xff1a;知识工场。全国知识图谱与语义计算大会&#xff08;CCKS: China Conference on Knowledge Graph and Semantic Computing&#xff09;由中国中文信息学会语言与知识计算专委会定期举办的全国年度学术会议。CCKS源于国内两个主要的相关会议&#xf…

数据结构--栈--共享顺序栈

共享顺序栈&#xff1a;内部也是一个数组 将两个栈放在数组的两端&#xff0c;一个从数组首端开始压栈&#xff0c;一个从数组尾部开始压栈&#xff0c;等到两边栈顶在中间相遇时&#xff0c;栈满。 共享顺序栈在某些情况下可以节省空间。 头文件 sharingStack.h //共享顺序…

一个励志PM小哥哥的Java转型之路

先给大家看张我朋友圈截图&#xff1a; 这哥们本科学英语的&#xff0c;毕业后做了产品经理&#xff0c;去年 9 月份开始学 Java&#xff0c;6 个月的时间&#xff0c;拿到了快手的 Offer。如果你对 Java 也有兴趣&#xff0c;不妨听完这个故事。你是不是也和他当时的处境…

最全蚂蚁金服高级Java面试题目(3面)

一面&#xff1a; JVM数据存储模型&#xff0c;新生代、年老代的构造&#xff1f; java GC算法&#xff0c;什么时候会触发minor gc&#xff0c;什么时候会触发full gc&#xff1f; GC 可达性分析中哪些算是GC ROOT&#xff1f; 你熟悉的JVM调优参数&#xff0c;使用过哪些调…

运用事理图谱搞事情:新闻预警、事件监测、文本可视化、出行规划与历时事件流生成

目前&#xff0c;事理图谱在描述领域事件时空信息上具有独特性&#xff0c;这种逻辑图结构能够以一种直观的方式向我们展现出一个领域知识的链路信息。从学术的角度上来说&#xff0c;事理图谱与事件抽取、事件关系抽取、脚本学习、事件链生成、篇章句间关系识别、图谱图结构运…

CCKS 2018 | 最佳论文:南京大学提出 DSKG,将多层 RNN 用于知识图谱补全

本文转载自公众号&#xff1a;机器之心。 选自CCKS 2018作者&#xff1a;Lingbing Guo、Qingheng Zhang、Weiyi Ge、Wei Hu、Yuzhong Qu机器之心编译参与&#xff1a;Panda、刘晓坤2018 年 8 月 14-17 日&#xff0c;主题为「知识计算与语言理解」的 2018 全国知识图谱…

计算机软件系统

计算机软件系统按其功能可分为系统软件和应用软件两大类。1、系统软件系统软件是指管理、控制、和维护计算机及其外部设备&#xff0c;提供用户与计算机之间操作界面等方面的软件&#xff0c;它并不专门针对具体的应用问题。代表性的系统软件有&#xff1a;操作系统、数据库管理…

数据结构--栈--浏览器前进后退应用

浏览器前进后退&#xff1a; 当你依次浏览a&#xff0c;b&#xff0c;c,然后回到b&#xff0c;再浏览d&#xff0c;就只能查看a&#xff0c;b&#xff0c;d&#xff0c;了。 原理&#xff1a; 利用两个栈A,B 浏览新网页的时候&#xff0c;压入栈A&#xff0c;清空栈B前进&…

关于BERT,面试官们都怎么问

1.BERT 的基本原理是什么&#xff1f;BERT 来自 Google 的论文Pre-training of Deep Bidirectional Transformers for Language Understanding&#xff0c;BERT 是“Bidirectional Encoder Representations from Transformers”的首字母缩写&#xff0c;整体是一个自编码语言模…

牛逼!支付宝高级Java三面题目:线程锁+事务+雪崩+Docker等

支付宝高级Java一面 JVM中的老年代在什么情况下会触发GC&#xff1f; CMS的垃圾回收步骤&#xff0c;G1和CMS的区别&#xff1f; CMS哪个阶段是并发的&#xff0c;哪个阶段是串行的&#xff1f; 谈谈Java线程池&#xff0c;线程池中几个参数含义 谈谈你了解的J.U.C包的JDK源…

鲍捷 | 深度解析知识图谱发展关键阶段及技术脉络

本文转载自公众号&#xff1a; AI科技大本营 。 分享嘉宾 | 鲍捷&#xff08;文因互联CEO&#xff09;出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09;知识图谱是人工智能三大分支之一——符号主义——在新时期主要的落地技术方式。该技术虽然在 20…

8大常用数据库管理系统简介

转自&#xff1a;http://vps.zzidc.com/vpsjishu/817.html 数据库管理系统(Database Management System)是种操纵和管理数据库的大型软件&#xff0c;是用于建立、使用和维护数据库&#xff0c;简称DBMS。是企业进行数据管理及维护不可或缺的数据管理软件。 8大常用数据库管理系…

知识图谱之语言计算与信息抽取

语言计算与信息抽取是自然语言处理中两块重要内容。本文将根据自己的工作总结&#xff0c;形成了语言计算与信息抽取的知识图谱分布图。 一、总体图谱 二、概念抽取 三、实体抽取 四、事件抽取 五、语言监测 六、文本计算内容 七、文本内容计算应用 总结 本文介绍了关于语言…

数据结构--队列Queue--链式队列、顺序队列

队列&#xff1a;先进先出&#xff0c;就如排队一样&#xff0c;先到的&#xff0c;先排上 1.链式队列 1.1 头文件 listQueue.h /*** description: 链式队列* author: michael ming* date: 2019/4/1 22:47* modified by:*/#ifndef QUEUE_LISTQUEUE_H #define QUEUE_LISTQUEU…

技术动态 | 人工智能开源软件发展现状连载——知识图谱开源软件

本文转载自公众号&#xff1a;中国人工智能开源软件发展联盟&#xff0c;欢迎大家点击文末二维码关注。知识图谱 (Knowledge Graph)是一种基于图的数据结构&#xff0c;由节点(Point)和边(Edge)组成。在知识图谱里&#xff0c;每个节点表示现实世界中存在的“实体”&#xff0c…

2018 支付宝Java开发四面:Ngnix+MQ队列+集群+并发抢购

一面 介绍项目 java 线程池的实现原理&#xff0c;threadpoolexecutor关键参数解释 hashmap的原理&#xff0c;容量为什么是2的幂次 为什么要同时重写hashcode和equals ConcurrentHashMap如何实现线程安全&#xff1f; 介绍Java多线程的5大状态&#xff0c;以及状态图流转…

ACL2020 | 线上搜索结果大幅提升!亚马逊提出对抗式query-doc相关性模型

一只小狐狸带你解锁 炼丹术&NLP 秘籍作者&#xff1a;机智的叉烧&#xff08;OPPO算法工程师&#xff0c;擅长Query理解方向&#xff09;背景搜索和推荐经常会被放在一起对比&#xff0c;其中最突出的区别就是搜索中存在query&#xff0c;需要充分考虑召回内容和query之间的…