栈的解析及C++实现
来源:互联网 发布:广州小孩学编程 编辑:程序博客网 时间:2024/05/20 05:10
介绍
栈是一种线性结构,它有以下几个特点:
1)栈中数据是按照“后进先出”方式进出栈的
2)向栈中添加/删除数据时,只能从栈顶进行操作
栈通常包括三种操作:top、pop、push
top -- 返回栈顶元素
pop -- 返回并删除栈顶元素
push -- 向栈中添加元素
常见错误:栈空时进行top或pop操作
解决方法:用户在使用top或pop操作时,需确保栈是非空的
————————————————————————————————————————————————————————————————————————————
栈的示意图
出栈
入栈
栈的C++实现
顺序栈
顺序栈结构实现的头文件SeqStack.h
#ifndef SeqStack_byNim#define SeqStack_byNim#include<iostream>using namespace std;const int MAX_SIZE=100;template <class T>class SeqStack{private:T *data;int topPointer;public:SeqStack();~SeqStack();void push(T e);T pop();T top();bool empty();};template <class T>SeqStack<T>::SeqStack(){topPointer=-1;data=new T[MAX_SIZE];}template <class T>SeqStack<T>::~SeqStack(){topPointer=-1;delete []data;}template <class T>void SeqStack<T>::push(T e)//入栈操作{if(topPointer==MAX_SIZE-1){cout<<"OVERFLOW"<<endl;return;}topPointer++;data[topPointer]=e;}template <class T>T SeqStack<T>::pop()//出栈操作 {if(topPointer==-1){throw "栈空";}return data[topPointer--];}template <class T>T SeqStack<T>::top(){if(topPointer==-1){throw "栈空";}return data[topPointer];}template <class T>bool SeqStack<T>::empty(){if(topPointer==-1){return true;}return false;}#endif
测试文件:SStackTest.cpp
#include<iostream>#include "SeqStack.h"using namespace std;int main(){int tmp = 0;SeqStack<int> *astack = new SeqStack<int>;cout<<"main"<<endl;//将10, 20, 30 依次推入栈中astack->push(10); astack->push(20); astack->push(30); // 将“栈顶元素”赋值给tmp,并删除“栈顶元素” tmp = astack->pop(); cout<<"tmp="<<tmp<<endl; // 只将“栈顶”赋值给tmp,不删除该元素 tmp = astack->top(); cout<<"tmp="<<tmp<<endl; astack->push(40); while(!astack->empty()) { tmp = astack->pop(); cout<<"tmp="<<tmp<<endl;}return 0;}
链栈
链栈结构实现的头文件:LinkStack.h
#ifndef LinkStack_byNim#define LinkStack_byNim#include<iostream>using namespace std;template<class T>struct Node{T data;//数据域 Node *next;//指针域 };template<class T>class LinkStack{private:Node<T> *topPointer;public:LinkStack();~LinkStack();void push(T e);T pop();T top();bool empty();};template<class T>LinkStack<T>::LinkStack(){topPointer=new Node<T>;topPointer->next=NULL;}template<class T>LinkStack<T>::~LinkStack(){delete topPointer;}template<class T>void LinkStack<T>::push(T e){Node <T> *aNode;aNode=new Node<T>;aNode->data=e;aNode->next=topPointer;topPointer=aNode;}template<class T>T LinkStack<T>::pop(){if(topPointer==NULL)throw "下溢";Node <T> *p;p=topPointer;T rtndata = topPointer->data;topPointer=topPointer->next;delete p;return rtndata;}template<class T>T LinkStack<T>::top(){if(topPointer==NULL)throw "Empty";return topPointer->data;}template<class T>bool LinkStack<T>::empty(){if(topPointer==NULL)return true;return false;}#endif
测试文件:LStackTest.cpp
#include<iostream>#include "LinkStack.h"using namespace std;int main(){string tmp;LinkStack<string> *astack = new LinkStack<string>;cout<<"main"<<endl;//将"cat"、"dog"、"pig"依次推入栈中astack->push("cat"); astack->push("dog"); astack->push("pig"); // 将“栈顶元素”赋值给tmp,并删除“栈顶元素” tmp = astack->pop(); cout<<"tmp="<<tmp<<endl; // 只将“栈顶”赋值给tmp,不删除该元素 tmp = astack->top(); cout<<"tmp="<<tmp<<endl; astack->push("duck"); while(!astack->empty()) { tmp = astack->pop(); cout<<"tmp="<<tmp<<endl;}return 0;}
STL中自带的“栈”
头文件:#include <stack>
测试文件:StackTest.cpp
#include<iostream>#include<stack>using namespace std;int main(){int tmp = 0;stack<int> *astack = new stack<int>;cout<<"main"<<endl;//将10, 20, 30 依次推入栈中astack->push(10); astack->push(20); astack->push(30); // 删除“栈顶元素”,pop操作不返回栈顶数据 astack->pop(); cout<<"tmp="<<tmp<<endl; // 只将“栈顶”赋值给tmp,不删除该元素 tmp = astack->top(); cout<<"tmp="<<tmp<<endl; astack->push(40); while(!astack->empty()) { tmp = astack->top(); cout<<"tmp="<<tmp<<endl; astack->pop();}return 0;}
注意:STL中自带的stack的pop操作不返回栈顶元素,只进行删除动作
0 0
- 栈的解析及C++实现
- 数据压缩解析及C语言实现介绍
- 常见设计模式的解析和实现(C++)文档及源码打包下载
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java) (转载)
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- JavaScript 预解析的原理及实现
- URL的解析,C语言实现
- C语言实现单链表的相关解析
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)
- 动态栈的存储结构及算法C语言实现
- C语言数据结构----栈的定义及实现
- 数据结构:栈的顺序结构及实现(C++)
- 栈的链式存储结构及C实现
- 【C语言】递归实现栈的逆序及排序
- 栈的C语言实现及相关知识点总结
- c 解析命令行实现
- 根据图片url写入图片到制定位置
- arukas 的 Endpoint
- LeetCode 448. Find All Numbers Disappeared in an Array
- 2.系统开发基础-软件开发方法(2)
- CONCAT(字符串连接函数)和GROUP_CONCAT的一个例子
- 栈的解析及C++实现
- Python NLTK 学习笔记1
- Android中点击事件的4中写法
- 桶排序(bucket sort)
- 路由配置与管理——ISIS路由配置与管理3
- java socket简易聊天室
- SpringBoot -- thymeleaf
- weget 下载整个网站
- (c++)求以下三数的和,保留2位小数 1~a之和 1~b的平方和 1~c的倒数和(100 50 10)