栈的定义及其基本运算
基本定义:
栈(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里调试过,但由于本人水平所限,手敲过程中难免会有所纰漏,望广大读者批评指正,谢谢!
(好像也没读者。)