c/c++常用算法(3) -- 数据结构(栈)

一、概念:


    (Stack):是限制在表的一端进行插入和删除操作的线性表。又称为后进先出(LIFO(Last In First Out)或先进后出(FILO(First In Last Out)线性表。

    栈顶(Top):允许进行插入、删除操作的一端,又称为表尾。用栈顶指针(top)来指示栈顶元素。

    栈底(Bottom):是固定端,又称为表头。

    空栈:当表中没有元素时称为空栈。


    设栈S=(a1,a2,…an),则a1称为栈底元素,an为栈顶元素,如图3-1所示。

    栈中元素按a1,a2,…an的次序进栈,退栈的第一个元素应为栈顶元素。即栈的修改是按后进先出的原则进行的。



二、 栈的抽象数据类型定义

ADT Stack{
    数据对象:D ={ ai|ai∈ElemSet,  i=1,2,…,n,n≥0 }
    数据关系:R ={<ai-1, ai>|ai-1,ai∈D,  i=2,3,…,n }
    基本操作:初始化、进栈、出栈、取栈顶元素等
    } ADT Stack

三、代码


Stack.h

#ifndef __CHelloWorld__Stack__
#define __CHelloWorld__Stack__

#include <iostream>
#define MAX 5

class stack
{
    //数据成员
    float num[MAX]; //存放栈数据的数组
    int top;         //指示栈顶位置的变量
public:
    void init(void);    //初始化函数
    void push(float x); //入栈函数
    float pop(void);    //出栈函数

};



#endif /* defined(__CHelloWorld__Stack__) */
Stack.cpp

#include "Stack.h"

void stack::init(void)
{
    top = 0;
}

void stack::push(float x)
{
    if (top==MAX)
    {
        std::cout<<"Stack is full !"<<std::endl;
        return;
    };
    num[top]=x;
    top++;
}

float stack::pop(void)
{
    top--;
    if (top<0)
    {
        std::cout<<"Stack is underflow !"<<std::endl;
        return 0;
    };
    return num[top];
}
main.cpp

#include <iostream>
#include "Stack.h"

using namespace std;

int main(int argc, const char * argv[])
{
    
    //声明变量和对象
    int i;
    float x;
    stack a,b;    //声明(创建)栈对象
    //以下对栈对象初始化
    a.init();
    b.init();
    //以下利用循环和push()成员函数将2,4,6,8,10依次入a栈对象
    for (i=1; i<=MAX; i++)
        a.push(2*i);
    //以下利用循环和pop()成员函数依次弹出a栈中的数据并显示
    for (i=1; i<=MAX; i++)
        cout<<a.pop()<<" ";
    cout<<endl;
    //以下利用循环和push()成员函数将键盘输入的数据依次入b栈
    cout<<"Please input five numbers."<<endl;
    for (i=1; i<=MAX; i++) {
        cin>>x;
        b.push(x);
    }
    
    //以下利用循环和pop()成员函数依次弹出b栈中的数据并显示
    for (i=1; i<=MAX; i++)
        cout<<b.pop()<<" ";
    
    // std::cout << "Hello, World!\n";
    return 0;
}

演示效果图:


        


参考书籍:《C/C++常用算法手册》  《数据结构-清华大学严蔚敏》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血枫叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值