数据结构库——顺序栈的概念及实现

1,栈的定义:

1,栈是一种特殊的线性表;

2,栈仅能在线性表的一端进行操作:

1,栈顶(Top):允许操作的一端;

2,栈底(Bottom):不允许操作的一端;

2,栈的特性:

1,后进先出(Last In First Out)(只有一个特性);

3,栈的操作(创销进出顶大清):

1,创建栈(Stack());

2,销毁栈(~Stack());

3,进栈(push());

4,出栈(pop());

5,获取栈顶元素(top());

6,获取栈的大小(size());

7,清空栈(clear())(栈是容器,实际生活中也有);

4,栈的实现:

5,栈的顺序实现:

6,StaticStack 设计要点:

1,模板类:

1,使用原生数组作为栈的存储空间(顺序栈的设计核心);

2,使用模板参数决定栈的最大空间;

7,基于顺序存储结构的栈 StaticStack 的实现:

 1 #ifndef STATICSTACK_H
 2 #define STATICSTACK_H
 3
 4 #include "Stack.h"
 5 #include "Exception.h"
 6
 7 namespace DTLib
 8 {
 9
10 template <typename T, int N>
11 class StaticStack : public Stack<T>
12 {
13 protected:
14     T m_space[N];  // 栈存储空间, N为模板参数;顺序存储,所以要原生数组;如果生成对象为类,即使没有存储数据(m_size = 0),也会调用构造函数和析构函数,此时不高效;因为原生数组作为存储空间的时候,在创建栈对象的时候,会调用对应的泛指类型的构造函数;
15     int m_size;   // 当前栈大小
16    int m_top;    // 栈顶标识,就相当于数组中的下标;
17
18 public:
19     StaticStack()    // O(1)
20     {
21         m_top = -1;  // 当前栈中一个没有栈顶,因为一个数据也没有
22         m_size = 0;  // 当前栈中一个数据也没有
23    }
24
25     int capacity() const    // O(1),当前栈的最大存储量
26     {
27         return N;
28    }
29
30     void push(const T& e)    // O(1)
31     {
32         if( m_size < N )
33         {
34             m_space[m_top + 1] = e;   // 异常安全,因为 e 可能为类,而其重载“=”可能发生异常,要保证栈的状态安全;
35             m_top++;
36             m_size++;
37         }
38         else
39         {
40             THROW_EXCEPTION(InvalidOperationException, "No enough space to push StaticStack ...");
41         }
42    }
43
44     void pop()   // O(1)
45     {
46         if( m_size > 0 )
47         {
48             m_top--;
49             m_size--;
50         }
51         else
52         {
53             THROW_EXCEPTION(InvalidOperationException, "No element to pop StaticStack ...");
54         }
55    }
56
57     T top() const   // 获得当前的栈顶元素数据值 O(1)
58     {
59         if( m_size > 0 )
60         {
61             return m_space[m_top];   // 直接返回当前栈顶的元素
62         }
63         else
64         {
65             THROW_EXCEPTION(InvalidOperationException, "No element in current Stcak ...");
66         }
67     }
68     void clear()  // O(1)
69     {
70         m_top = -1;
71         m_size = 0;
72     }
73     int size() const   // O(1)
74     {
75         return m_size;
76     }
77 };
78
79 }
80
81 #endif // STATICSTACK_H

8,StaticStack 的测试代码:

 1 #include <iostream>
 2 #include "StaticStack.h"
 3
 4 using namespace std;
 5 using namespace DTLib;
 6
 7 int main()
 8 {
 9    StaticStack<int, 10> stack;
10
11     try
12     {
13         stack.pop();
14     }
15     catch(const Exception& e)
16     {
17         cout << e.message() << endl;
18         cout << e.location() << endl;
19    }
20
21     for(int i=0; i<10; i++)
22     {
23         stack.push(i);
24    }
25
26     while(stack.size() > 0)
27     {
28         cout << stack.top() << endl;
29         stack.pop();
30    }
31
32     return 0;
33 }

9,小结:

1,栈是一种特殊的线性表;

2,栈只允许在线性表的一端进行操作;

3,StaticStack 使用原生数组作为内部存储空间;

4,StaticStack 的最大容量由模板参数决定;

原文地址:https://www.cnblogs.com/dishengAndziyu/p/10922918.html

时间: 2024-08-05 13:30:45

数据结构库——顺序栈的概念及实现的相关文章

数据结构之自建算法库——顺序栈

本文针对数据结构基础系列网络课程(3):栈和队列中第3课时栈的顺序存储结构及其基本运算实现. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 顺序栈算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:sqstack.h,包含定义顺序栈数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef SQSTACK_H_INCLUDED #define SQSTACK_H_INCLUDED #define MaxSize 100 typedef

浅谈数据结构之顺序栈(三)

栈:是限定仅在表尾进行插入与删除操作的线性表.我们把允许插入与删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的称为空栈.栈的插入操作,叫作进栈,也叫压栈.入栈,类似于子弹入弹夹:栈的删除操作,叫作出栈,也叫弹栈,如同弹夹中的子弹出夹.注意:栈的定义中的"表尾"指的是"栈顶",而不是"栈底". 首先,栈是一个线性表,也就是说:栈具有线性结构,即前驱后继关系:只不过它是一个特殊的线性表而已,它的特殊之处在于限制了这个线性表的插入与删除位置,它始

数据结构之顺序栈基本操作SqStack

顺序栈SqStack 基本操作 1 Status InitStack()//构造一个空栈S 2 Status DestroyStack()//销毁栈S,S不再存在 3 Status ClearStack()//把S置为空栈 4 Status StackEmpty()//若S为空栈,则返回true,否则返回false 5 int StackLength()//返回S的元素个数,即栈的长度 6 Status GetTop(SElemType &e)//若栈不空,则用e返回S的栈顶元素,并返回OK,否

【数据结构之顺序栈的基本运算】

//顺序栈 public class OrderStack { //(1)置空栈 void InitStack(SeqStack *S){ S->top = -1; } //(2)判断栈空 int StackEmpty(SeqStack *S){ return S->top == -1; } //(3)判断栈满 int StackFull(SeqStack *S){ return S->top == StackSize-1; } //(4)进栈 void push(S,x){ if(St

数据结构之顺序栈(C++版)

#include <iostream>#include <stdlib.h>#define MAXLISTSIZE 100 //预设的存储空间最大容量using namespace std; typedef string ElemType;typedef struct{ ElemType *base; //存储空间基址 int top; //栈顶指针 int stacksize; //允许的最大存储空间以元素为单位}Stack; void InitStack(Stack &

数据结构:顺序栈

这是严蔚敏吴伟民版本的算法,感觉没<大话数据结构>里面的简单易懂 这个版本里面的top指针指向下一个空单元格,这个其实是有些问题的,因为栈满的时候,top是指向栈外的,有些不安全. 1 #ifndef SQ_STACK_HEAD 2 #define SQ_STACK_HEAD 3 #include <stdio.h> 4 #include <stdlib.h> 5 #define Status int 6 #define OVERFLOW -1 7 #define OK

【数据结构】顺序栈的实现(c++)

头文件: #pragma once #include <iostream> #include <assert.h> using namespace std; template<class Type> class SeqStack { public: SeqStack(size_t sz = INIT_SZ); ~SeqStack(); public: bool empty()const; bool full()const; void show()const; bool

【数据结构】顺序栈

#include <STDIO.H> #include <STRING.H> #include <STDLIB.H> typedef struct SeqStack { int length; int top; char *data; }seqstack; seqstack* CreatStack(seqstack *s,int n) { s=(seqstack *)malloc(sizeof(seqstack)+n*sizeof(char)); if(s==NULL)

顺序栈的总结

基本数据结构之-顺序栈 栈是一种先进后出的数据结构,我们可以使用一个数组来模拟栈的这种结构,将数组的尾部当做栈的栈顶似乎是一个不错的选择(插入和移除元素是不涉及到数据的移动),也可以很好的控制数组的长度,和数据的进栈和出栈! 首先先解析一下顺序栈的数据结构 1 需要一个数据域来存储数据 考虑到可能存储自定义的数据类型,所以我们选择存储每个数据的开始的地址 (void **stack) 2 需要一个值来记录当前的数据域的长度 (size) 3 需要一个值来记录当前的容器的长度 typedef st