栈&队列&栈帧&递归

   *栈的定义——Stack

栈是只允许在末端进行插入和删除的线性表,栈具有后进先出的特征(LIFO,Last In First Out).

     

   *栈的应用

栈很大意义上模拟了压栈,实现了递归转非递归。还有算术表达式求值,波兰表达式(后缀表达式),迷宫问题等。

   *队列的定义

队列值允许在表的队尾进行插入,在表对头进行删除。队列具有先进先出的特性(FIFO,First In First Out).

    

 

1、优先级队列的定义

每次从队列中取出的都是最高优先级的数据,这种队列就是优先级队列。

——后续使用Heap实现

2、队列的应用

(1)生产者消费者模型,如网络数据buffer

(2)任务队列

(3)图的广度优先遍历

*一般函数的调用栈帧

*递归函数调用栈帧

*函数栈帧调用&数据结构栈帧--栈实现将递归程序转换为非递归程序

#include<iostream>
#include<stack>
using namespace std;
template<class T>
struct Node
{
public:
 Node(const T& x)
  :_data(x)
  ,_next(0)
 {}
 T _data;//数据
 Node* _next;//指向下个节点的指针
};
template<class T>
class SList
{
public:
 SList()
  :_head(0)
  ,_tail(0)
 {}
public:
 void PushBack(const T& x)
 {
  if(!_head)//链表为空
  {
   _head=new Node<T> (x);
   _tail=_head;
  }
  else
  {
   _tail->_next=new Node<T> (x);
   _tail=_tail->_next;
  }
 }
 Node<T>* GetHead()
 {
  return _head;
 }
private:
 Node<T>* _head;
 Node<T>* _tail;
};
//逆序打印单链表递归实现
template<class T>
void PrintTailToHead_R(Node<T>* head)
{
 if(head)
 {
  PrintTailToHead_R(head->_next);
  cout<<head->_data<<" ";
 }
}
//逆序打印单链表非递归实现
template<class T>
void PrintTailToHead(Node<T>* head)
{
 stack<Node<T>*> s;
 while(head)
 {
  s.push(head);
  head=head->_next;
 }
 while(!s.empty())
 {
  cout<<s.top()->_data<<" ";
  s.pop();
 }
}
void Test()
{
 SList<int> s1;
 s1.PushBack(1);
 s1.PushBack(2);
 s1.PushBack(3);
 s1.PushBack(4);
 s1.PushBack(5);
 
 PrintTailToHead_R(s1.GetHead());
 cout<<endl;
 
 PrintTailToHead(s1.GetHead());
 cout<<endl;
}
int main()
{
 Test();
 return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章