栈的定义及其基本运算
2016-03-16 23:27
603 查看
基本定义:
栈(Stack)是n个元素a1,a2,…an,组成的有限序列,记作S =(a1,a2,…,an),并且只能在一端插入和删除元素,n=0时称为空栈。
栈的特征:
由于栈只能从一端插入和删除元素,故栈具有后进先出(Last in,first out,LIFO)的特性。称插入和删除的一端为栈顶(top),另一端为栈底(bottom)。称插入元素为入栈或压栈(push),删除元素为出栈或弹栈(pop)。
栈的基本运算定义:
1.初始化栈:设置栈为空栈。
2.判断栈是否为空栈:若栈为空,则返回true,否则返回false。因此应为布尔类型。
3.判断栈是否满栈:若栈已满,则返回true,否则返回false。亦为布尔类型。
4.取栈顶元素:若栈不空,则将栈顶元素的值送入变量x中,否则应返回出错信息。为此,该函数参数列表中应定义变量x。
5.入栈:将值为x的元素送入到栈顶,若栈已满,返回出错信息。
6.出栈:若栈不空,则删除当前元素,否则应返回出错信息。
以上即为栈的6项基本实现功能,其实栈作为一种应用非常广泛的数据结构,在实际应用中还有许多操作。为实现上述操作,应定义一个类stack。那么如何存储栈里的元素?为此,可设置一个数组data[maxlen],同时,设置一个与maxlen同类型的变量length(此处默认为int型变量,关于如何使主函数中的变量不受影响的内容,会在之后的类模板中提到(如果我会写相关博客的话)),该变量表示当前数组的长度。以下为类stack的具体实现代码:
下图为运行结果:
注:以上内容仅为栈的最基本运算,之后会写一些本人在学习过程中遇到的关于栈的应用的题目,以上代码为纯手打,虽然先在IDE里调试过,但由于本人水平所限,手敲过程中难免会有所纰漏,望广大读者批评指正,谢谢!
(好像也没读者。)
栈(Stack)是n个元素a1,a2,…an,组成的有限序列,记作S =(a1,a2,…,an),并且只能在一端插入和删除元素,n=0时称为空栈。
栈的特征:
由于栈只能从一端插入和删除元素,故栈具有后进先出(Last in,first out,LIFO)的特性。称插入和删除的一端为栈顶(top),另一端为栈底(bottom)。称插入元素为入栈或压栈(push),删除元素为出栈或弹栈(pop)。
栈的基本运算定义:
1.初始化栈:设置栈为空栈。
2.判断栈是否为空栈:若栈为空,则返回true,否则返回false。因此应为布尔类型。
3.判断栈是否满栈:若栈已满,则返回true,否则返回false。亦为布尔类型。
4.取栈顶元素:若栈不空,则将栈顶元素的值送入变量x中,否则应返回出错信息。为此,该函数参数列表中应定义变量x。
5.入栈:将值为x的元素送入到栈顶,若栈已满,返回出错信息。
6.出栈:若栈不空,则删除当前元素,否则应返回出错信息。
以上即为栈的6项基本实现功能,其实栈作为一种应用非常广泛的数据结构,在实际应用中还有许多操作。为实现上述操作,应定义一个类stack。那么如何存储栈里的元素?为此,可设置一个数组data[maxlen],同时,设置一个与maxlen同类型的变量length(此处默认为int型变量,关于如何使主函数中的变量不受影响的内容,会在之后的类模板中提到(如果我会写相关博客的话)),该变量表示当前数组的长度。以下为类stack的具体实现代码:
#include<iostream> using namespace std; #define maxlen 100 //定义数组的长度 class stack{ public: stack(){length = 0;} //初始化为空栈 bool isEmpty(); bool isFull(); int get_top(int& x); int pop(); int push(int x); int locate(int x); //该函数为本人上机时加入的函数,其作用为查询数x在栈中的位置 private: int data[maxlen]; int length; }; bool stack::isEmpty() //由于初始化栈时length=0,所以默认为空栈 { if(length == 0) return true; else return false; } bool stack::isFull() { if(length == maxlen) return true; else reutrn false; } int stack::get_top(int& x)/*注意此处为取地址函数,这是因为我们无需输出栈顶元素的值,只需得到该值的地址即可*/ { if(isEmpty()) //需先判断栈是否非空,若为空则返回出错信息(-1) return -1; else x = data[length - 1];//将栈顶元素存入到x中 return 0; } int stack::pop() { if(isEmpty()) return -1; else length --;//删除栈顶元素只需将数组长度减1 return 0; } int stack::push(int x) { if(isFull()) return -1; else{ data[length] = x; //将x的值放入数组的最后一位 length ++;//数组长度加1 } return 0; } int stack::locate(int x) { int i;//定义局部变量 if(isEmpty()) cout<<"该栈为空,无法进行查找!"<<endl; else{ for(i = 0; i < length;i++){ if(data[i] == x){ cout<<"该数在第 "<<i + 1<<"号位置。"<<endl; break; //如果找到该值的位置,则跳出循环,注意:此处只能查找栈中该值的首位置 } } if(data[i] != x) cout<<"没有找到该数!"<<endl; } return 0; } int main() { stack s; int n,x; cout<<"请输入栈的长度:"; cin>>n; for(int i = 0; i < n; i++){ cin>>x; s.push(x);//将输入的值压入栈中 } cout<<"查找数字1所在的位置:"; int y = 1; s.locate(y); cout<<"逆序输出栈的元素:";//栈的一个基本应用 while(!s.isEmpty()){ s.get_top(x);//取出栈顶元素 cout<<x<<" ";//并输出 s.pop();//删除当前栈顶元素 } cout<<endl; s.locate(y);//再次调用该函数时,会返回出错信息 }
下图为运行结果:
注:以上内容仅为栈的最基本运算,之后会写一些本人在学习过程中遇到的关于栈的应用的题目,以上代码为纯手打,虽然先在IDE里调试过,但由于本人水平所限,手敲过程中难免会有所纰漏,望广大读者批评指正,谢谢!
(好像也没读者。)
相关文章推荐
- 面试题合集
- Android Fragment 真正的完全解析(上)
- 织梦CMS标签属性-常用标签
- 表现自己
- iOS8定位代理方法不回调解决方法
- c#面向对象基本知识
- calc 多项式计算 (STL版和非STL版) -SilverN
- PythonChallenge Mission 15
- MySQL Explain 详解
- 消息系统设计与实现
- iOS开发如何设置sqlite版本升级
- 『转载』Debussy快速上手(Verdi相似)
- Activity闪退
- Topo图
- J2EE的13种核心技术规范
- 批处理学习笔记1
- 作为程序员你累吗?
- linux的nohup命令的用法
- 直接可以拿去用的正则验证表达式
- poj 1463 Strategic game(树形dp,最小边覆盖集)