3线性结构栈队列

Posted long-w

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3线性结构栈队列相关的知识,希望对你有一定的参考价值。

一、栈的介绍

栈(stack),是一种线性存储结构,它有以下几个特点:
  (1) 栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的。
  (2) 向栈中添加/删除数据时,只能从栈顶进行操作。

栈通常包括的三种操作:push、peek、pop。
  push -- 向栈中添加元素。
  peek -- 返回栈顶元素。
  pop  -- 返回并删除栈顶元素的操作。

二、C++ 实现栈

 

C++的STL中本身就包含了stack类,基本上该stack类就能满足我们的需求,所以很少需要我们自己来实现。本部分介绍2种C++实现。
  1. C++实现一:数组实现的栈,能存储任意类型的数据。
  2. C++实现二:C++的 STL 中自带的"栈"(stack)的示例。

1、数组实现的栈,能存储任意类型的数据

ArrayStack.h

 

 1 #ifndef ARRAY_STACK_HXX
 2 #define ARRAY_STACK_HXX
 3 
 4 #include <iostream>
 5 
 6 using namespace std;
 7 
 8 template<class T> class ArrayStack{
 9     public:
10         ArrayStack();
11         ~ArrayStack();
12 
13         void push(T t);
14         T peek();
15         T pop();
16         int size();
17         int isEmpty();
18     private:
19         T *arr;
20         int count;
21 };
22 
23 // 创建“栈”,默认大小是12
24 template<class T>
25 ArrayStack<T>::ArrayStack()
26 {
27     arr = new T[12];
28     if (!arr)
29     {
30         cout<<"arr malloc error!"<<endl;
31     }
32 }
33 
34 // 销毁“栈”
35 template<class T>
36 ArrayStack<T>::~ArrayStack()
37 {
38     if (arr)
39     {
40         delete[] arr;
41         arr = NULL;
42     }
43 }
44 
45 // 将val添加到栈中
46 template<class T>
47 void ArrayStack<T>::push(T t)
48 {
49     //arr[count++] = val;
50     arr[count++] = t;
51 }
52 
53 // 返回“栈顶元素值”
54 template<class T>
55 T ArrayStack<T>::peek()
56 {
57     return arr[count-1];
58 }
59 
60 // 返回“栈顶元素值”,并删除“栈顶元素”
61 template<class T>
62 T ArrayStack<T>::pop()
63 {
64     int ret = arr[count-1];
65     count--;
66     return ret;
67 }
68 
69 // 返回“栈”的大小
70 template<class T>
71 int ArrayStack<T>::size()
72 {
73     return count;
74 }
75 
76 // 返回“栈”是否为空
77 template<class T>
78 int ArrayStack<T>::isEmpty()
79 {
80     return size()==0;
81 }
82 
83 #endif

 

main.cpp

 1 #include <iostream>
 2 #include "ArrayStack.h"
 3 using namespace std;
 4 
 5 int main() 
 6 {
 7     int tmp=0;
 8     ArrayStack<int> *astack = new ArrayStack<int>();
 9 
10     cout<<"main"<<endl;
11 
12     // 将10, 20, 30 依次推入栈中
13     astack->push(10);
14     astack->push(20);
15     astack->push(30);
16 
17     // 将“栈顶元素”赋值给tmp,并删除“栈顶元素”
18     tmp = astack->pop();
19     cout<<"tmp="<<tmp<<endl;
20 
21     // 只将“栈顶”赋值给tmp,不删除该元素.
22     tmp = astack->peek();
23 
24     astack->push(40);
25 
26     while (!astack->isEmpty())
27     {
28         tmp = astack->pop();
29         cout<<tmp<<endl;
30     }
31 
32     return 0;
33 }

 

说明关于"栈的声明和实现都在头文件中"的原因,是因为栈的实现利用了C++模板,而"C++编译器不能支持对模板的分离式编译"。需要说明的是,采用C++模板实现的;但是,默认数组的大小只有12,而且该实现不支持动态扩展。

 

2. C++的 STL 中自带的"栈"(stack)的示例

mian.cpp

 1 #include <iostream>
 2 #include <stack>
 3 using namespace std;
 4 
 5 /**
 6  * C++ 语言: STL 自带的“栈”(stack)的示例。
 7  *
 8  * @author skywang
 9  * @date 2013/11/07
10  */
11 int main ()
12 {
13     int tmp=0;
14     stack<int> istack;
15 
16     // 将10, 20, 30 依次推入栈中
17     istack.push(10);
18     istack.push(20);
19     istack.push(30);
20 
21     // 将“栈顶元素”赋值给tmp,并删除“栈顶元素”
22     istack.pop();
23 
24     // 只将“栈顶”赋值给tmp,不删除该元素.
25     tmp = istack.top();
26 
27     istack.push(40);
28 
29     while (!istack.empty())
30     {
31         tmp = istack.top();
32         istack.pop();
33         cout<<tmp<<endl;
34     }
35 
36     return 0;
37 }

三、队列的介绍

 

队列(Queue),是一种线性存储结构。它有以下几个特点:
  (1) 队列中数据是按照"先进先出(FIFO, First-In-First-Out)"方式进出队列的。
  (2) 队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。
队列通常包括的两种操作:入队列 和 出队列。

 

四、队列的C++实现

 

C++的STL中本身就包含了list类,基本上该list类就能满足我们的需求,所以很少需要我们自己来实现。本部分介绍2种C++实现。
1. 数组实现的队列,能存储任意类型的数据。

ArrayQueue.h

 1 #ifndef ARRAY_QUEUE_HXX
 2 #define ARRAY_QUEUE_HXX
 3 
 4 #include <iostream>
 5 using namespace std;
 6 
 7 template<class T> class ArrayQueue{
 8     public:
 9         ArrayQueue();
10         ~ArrayQueue();
11 
12         void add(T t);
13         T front();
14         T pop();
15         int size();
16         int is_empty();
17 
18     private:
19         T *arr;
20         int count;
21 };
22 
23 // 创建“队列”,默认大小是12
24 template<class T>
25 ArrayQueue<T>::ArrayQueue()
26 {
27     arr = new T[12];
28     if (!arr)
29     {
30         cout<<"arr malloc error!"<<endl;
31     }
32 }
33 
34 // 销毁“队列”
35 template<class T>
36 ArrayQueue<T>::~ArrayQueue()
37 {
38     if (arr)
39     {
40         delete[] arr;
41         arr = NULL;
42     }
43 }
44 
45 // 将val添加到队列的末尾
46 template<class T>
47 void ArrayQueue<T>::add(T t)
48 {
49     arr[count++] = t;
50 }
51 
52 
53 // 返回“队列开头元素”
54 template<class T>
55 T ArrayQueue<T>::front()
56 {
57     return arr[0];
58 }
59 
60 // 返回并删除“队列末尾的元素”
61 template<class T>
62 T ArrayQueue<T>::pop()
63 {
64     int i = 0;;
65     T ret = arr[0];
66 
67     count--;
68     while (i++<count)
69         arr[i-1] = arr[i];
70 
71     return ret;
72 }
73 
74 // 返回“队列”的大小
75 template<class T>
76 int ArrayQueue<T>::size()
77 {
78     return count;
79 }
80 
81 // 返回“队列”是否为空
82 template<class T>
83 int ArrayQueue<T>::is_empty()
84 {
85     return count==0;
86 }
87 
88 
89 #endif

 

main.cpp

 1 #include <iostream>
 2 #include "ArrayQueue.h"
 3 using namespace std;
 4 
 5 
 6 int main()
 7 {
 8     int tmp=0;
 9     ArrayQueue<int> *astack = new ArrayQueue<int>();
10 
11     // 将10, 20, 30 依次推入队列中
12     astack->add(10);
13     astack->add(20);
14     astack->add(30);
15 
16     // 将“队列开头元素”赋值给tmp,并删除“该元素”
17     tmp = astack->pop();
18     cout<<"tmp="<<tmp<<endl;
19 
20     // 只将“队列开头的元素”赋值给tmp,不删除该元素.
21     tmp = astack->front();
22     cout<<"tmp="<<tmp<<endl;
23 
24     astack->add(40);
25 
26     cout<<"is_empty()="<<astack->is_empty()<<endl;
27     cout<<"size()="<<astack->size()<<endl;
28     while (!astack->is_empty())
29     {
30         tmp = astack->pop();
31         cout<<tmp<<endl;
32     }
33 
34     return 0;
35 }

2.C++的 STL 中自带的"队列"(list)的示例。

main.cpp

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 
 5 /**
 6  * C++ : STL中的队列(queue)的演示程序。
 7  *
 8  * @author skywang
 9  * @date 2013/11/07
10  */
11 int main ()
12 {
13     int tmp=0;
14     queue<int> iqueue;
15 
16     // 将10, 20, 30 依次加入队列的末尾
17     iqueue.push(10);
18     iqueue.push(20);
19     iqueue.push(30);
20 
21     // 删除队列开头的元素
22     iqueue.pop();
23 
24     // 将“队列开头的元素”赋值给tmp,不删除该元素.
25     tmp = iqueue.front();
26     cout<<"tmp="<<tmp<<endl;
27 
28     // 将40加入到队列的末尾
29     iqueue.push(40);
30 
31     cout << "empty()=" << iqueue.empty() <<endl;
32     cout << "size()=" << iqueue.size() <<endl;
33     while (!iqueue.empty()) 
34     {
35         tmp = iqueue.front();
36         cout<<tmp<<endl;
37         iqueue.pop();  
38     }
39 
40     return 0;
41 }

 












以上是关于3线性结构栈队列的主要内容,如果未能解决你的问题,请参考以下文章

自考数据结构第三章,栈队列数组,期末不挂科指南,第3篇

数据结构《三》栈与队列的实现

数据结构之栈和队列

数据结构之线性表栈队列

22计算机408考研—数据结构—线性表栈队列数组

22计算机408考研—数据结构—线性表栈队列数组