数据结构1-栈

  数据结构一直是我最薄弱的地方,所以要好好学习一下。

  首先是栈。

  栈有,判断栈是否为空,判断栈是否为满,出栈,入栈,取栈顶元素,这5个功能,用类实现,就是5个方法,5个成员函数。

  为方便起见,栈能容纳元素的最大值设定为固定值。元素为int型。用C++实现如下:

  

 1 //实现一个栈
 2 #include<iostream>
 3
 4 using namespace std;
 5
 6 const int Max=100;
 7
 8 class stack
 9 {
10 private:
11     int data[Max];      //定义一个数组来存放数据
12     int top;            //指向栈顶
13 public:
14     stack();            //构造函数
15     ~stack();            //析构函数
16     bool empty()const;
17     bool full()const;
18     void push(int);
19     void pop();
20     int GetTop();
21 };
22
23 stack::stack()
24 {
25     top=-1;
26 }
27
28 stack::~stack()
29 {
30 }
31
32 bool stack::empty()const
33 {
34     return top==-1;
35 }
36
37 bool stack::full()const
38 {
39     return top==Max-1;
40 }
41
42 void stack::push(int x)
43 {
44     if(full())
45     {
46         cout<<"栈已满!"<<endl;
47         //exit (1);
48     }
49     else
50     {
51         top++;
52         data[top]=x;
53     }
54 }
55
56 void stack::pop()
57 {
58     if(empty())
59     {
60         cout<<"栈为空!"<<endl;
61         //exit (1);
62     }
63     else
64     {
65         top--;
66     }
67 }
68
69 int stack::GetTop()
70 {
71     if(empty())
72     {
73         cout<<"栈为空!"<<endl;
74         //exit (1);
75     }
76     else
77     {
78         return data[top];
79     }
80 }
81
82 int main()
83 {
84     stack s1;
85     s1.pop();
86     s1.push(1);
87     s1.push(2);
88     s1.push(3);
89     s1.push(4);
90     s1.push(5);
91     for(int i=0;i<5;i++)
92     {
93         cout<<s1.GetTop()<<endl;
94         s1.pop();
95     }
96     s1.pop();
97     return 0;
98 }

  在编写该栈的时候,学到了一个自己一直不知道的小细节,就是exit的用法,在60行处,如果栈为空,exit会直接退出整个程序,后面的代码将不再执行。

  上面写的栈存储的数据时int型,如果我们要存储其他类型的数据,比较麻烦,因此我用模板把栈重新写了一下。

//实现一个栈
#include<iostream>

using namespace std;

const int Max=100;

template<class T>
class stack
{
private:
    T data[Max];      //定义一个数组来存放数据
    int top;            //指向栈顶
public:
    stack();            //构造函数
    ~stack();            //析构函数
    bool empty()const;
    bool full()const;
    void push(T);
    void pop();
    T GetTop();
};

template<class T>
stack<T>::stack()
{
    top=-1;
}

template<class T>
stack<T>::~stack()
{
}

template<class T>
bool stack<T>::empty()const
{
    return top==-1;
}

template<class T>
bool stack<T>::full()const
{
    return top==Max-1;
}

template<class T>
void stack<T>::push(T x)
{
    if(full())
    {
        cout<<"栈已满!"<<endl;
        //exit (1);
    }
    else
    {
        top++;
        data[top]=x;
    }
}

template<class T>
void stack<T>::pop()
{
    if(empty())
    {
        cout<<"栈为空!"<<endl;
        //exit (1);
    }
    else
    {
        top--;
    }
}

template<class T>
T stack<T>::GetTop()
{
    if(empty())
    {
        cout<<"栈为空!"<<endl;
        //exit (1);
    }
    else
    {
        return data[top];
    }
}

int main()
{
    stack<char> s1;
    s1.pop();
    s1.push(‘a‘);
    s1.push(‘b‘);
    s1.push(‘c‘);
    s1.push(‘d‘);
    s1.push(‘e‘);
    for(int i=0;i<5;i++)
    {
        cout<<s1.GetTop()<<endl;
        s1.pop();
    }
    s1.pop();
    return 0;
}

  用了模板之后,stack就可以存储各种不同类型的数据。而不需要重新编写该类,非常方便。

数据结构1-栈,布布扣,bubuko.com

时间: 2024-12-28 11:39:57

数据结构1-栈的相关文章

数据结构之栈与队列

数据结构的有一个重要结构栈,栈这种数据结构就是满足先进后出的这种规则的数据结构就是栈,引用<大话数据结构>中的一个形象例子就是,子弹的弹夹,最先压入弹夹的子弹最后一个出弹夹,正好往一个栈里添加一个元素叫压栈.入栈,从栈里出来一个元素叫弹栈,出栈.指示器就叫栈帧. 栈图 现在就贴上代码: 栈的几个基本操作: #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node{

数据结构之栈定义及基本操作实现

终于有可以有时间写点数据结构的学习总结了,前段时间一直在紧张的忙一些项目,都没有空出时间来学习数据结构,现在终于可以稍微喘口气了,还是数据结构有意思,这两天看了点栈的东西,写下来总结一下,有错误的地方希望看到的朋友指出来,感激不尽. 根据学习,栈就是一种线性数据结构,栈的运算只能在表的一段进行,所以这种数据结构具有“后进先出”的特点. 接下来是栈的c语言实现.其中栈由一个top节点和bottom节点组成,这两个节点分别指向栈的顶部和底部.其中栈的组成结点是由结构体实现,结构体由数据库和指向下一个

【数据结构】栈和队列

栈和队列 容器数据结构是指一些包含了若干个其他相同或不同的数据结构的数据结构,被包含的这些每一个独立的数据结构都被称为一个元素,在一个容器中的元素往往支持相同的操作,具有类似的性质.之前说到过的线性表其实就是一种容器数据结构,本文中介绍的两种最常用的容器数据结构是栈和队列. 从功能上看,栈和队列大多用于计算过程中保存临时数据,这些数据是在计算过程中发现或产生的.在而后的计算中可能会用到这些数据.如果这些数据是固定的个数以及大小的话,可以构建几个变量来储存它们,但是如果这些数据不确定的话,就需要一

简单数据结构之栈模拟

1 /************************************************************************************** 2 * Function : 模拟栈 3 * Create Date : 2014/04/23 4 * Author : NTSK13 5 * Email : [email protected] 6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性. 7 * 任何单位和个人不经本人允许不得

Java数据结构之栈

package com.xingej.algorithm.datastructure.stack; /**  * 数据结构之栈Stack  *   * 以long类型为测试用例  *   * @author erjun 2017年12月4日 下午10:22:34  */ public class LongStack {     // 底层数据存储     private long[] arr; // 最大元素数量     private int maxSize; // 当前元素的指针     p

数据结构 - 链栈的实行(C语言)

数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在单链表的头部(如下图所示).另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的. 对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top=NULL 的时候. 链栈的结构代码如下: /* 链栈

数据结构 - 顺序栈的实行(C语言)

数据结构-顺序栈的实现 1 顺序栈的定义 既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈.线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表来说,用数组哪一端来作为栈顶和栈底比较好? 对,没错,下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底. 我们定义一个top变量来指示栈顶元素在数组中的位置,这top就如同中学物理学过的游标卡尺的游标,它可以来回移动,意味着栈顶的top可以变大变小,但无论如何游标不能超出尺的长度.同理

二、数据结构之栈、队列、循环队列

二.数据结构之栈.队列.循环队列 顺序栈 Stack.h 结构类型,函数声明: #ifndef _STACK_H_ #define _STACK_H_ typedef int SElementType; ///顺序栈 #define STACK_INIT_SIZE 20 #define STACK_INCREMENT 10 typedef struct { SElementType * base; SElementType * top; int stackSize;///当前栈的大小 }SqSt

数据结构之栈的简单应用(判断字符串中括号的合法性)

数据结构之栈(判断字符串中括号的合法性) 栈的定义 栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为"栈顶",相应的另一端称为"栈底":另外其还有先进后出,后进先出的特征. 栈是一种高效的数据结构,因为数据只能在栈的顶端添加或者删除,所以这样的操作很快而且容易实现. 说到线性结构,得先了解一下数据的逻辑结构,数据的逻辑结构分为线性结构.集合结构.树形结构和图形结构,如下图所示,栈是一种特殊的线性表,是线性结构的一种. JavaScrip

[数据结构]单调栈的基本应用2

[数据结构]单调栈的基本应用2 一.前言 单调栈的基本应用2是单调栈的基本应用1的延伸.应用2主要解决的是二维平面的一些问题. 二.基本应用2 虽然已经应用到二维平面,但是单调栈的思想并没有变化 更多应用的是延伸的位置.本质是ai的左/右第一个大于ai的元素位置 下面列举的一些平面内单调栈的例题: 例1: POJ2559 最大矩形面积 题目描述: 给定n个依次排列并且面积为1*hi的矩形,现求这个图形所包含最大的矩形的面积. 上图中7个矩形的h依次为2 1 4 5 1 3 3.注意题目有多组数据