栈的定义及其基本运算

基本定义

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值