栈和队列

1.栈的特点:先进后出,由栈顶指针来控制数据的存储。

2.队列的特点:先进先出。

3.链表主要的优点就是可以方便的进行插入、删除操作,利用这一优点,可以在游戏设计过程中方便地管理大量的数据。

4.单向线性表的链式存储:有一个数据,一个后指针。最后一个元素的Next指针为NULL.

5.栈是一种只允许在一端进行插入和删除的线性表,它是一种操作受限的线性表。

6.在表中只允许进行插入和删除的一端称为栈顶,另一端称为栈底。

7.栈的插入操作通常称为入栈或进栈,而栈的删除操作则称为出栈或退栈。当栈中没有数据元素时,称为空栈。

8.顺序栈类的代码:

   #ifndef CStack_H_

#define CStack_H_

#pragma once

 

template<typename T> class CStack

{

protected:

const int m_iLength;

T * m_pArray; //存储数据的数组

int m_iStackTop; //栈顶元素标号,描述下一个可入栈位置

public:

CStack(int iLength);

~CStack(void);

//栈的基本操作:显示栈内元素、判定栈是否为满、

//       是否为空、入(压)栈、出栈

protected:

bool isFull();

bool isEmpty();

public:

void showStack();

void pushStack(T _data);

T popStack();

};

#endif

#include "Utility.h"

#include "Stack.h"

 

 

template<typename T>CStack<T>::CStack(int iLength):

m_iLength(iLength)

{

m_pArray = new T[m_iLength];

memset(m_pArray,0,m_iLength*sizeof(int));

m_iStackTop = 0;

}

 

template<typename T>CStack<T>::~CStack(void)

{

Safe_Delete_Array(m_pArray);

}

 

template<typename T>void CStack<T>::showStack()

{

if(isEmpty())

{

cout<<"空栈!!!"<<endl;

return;

}

cout<<"栈内元素为:"<<endl;

for( int i = m_iStackTop-1 ; i >= 0 ; --i )

cout<<"stack["<<i<<"]="<<m_pArray[i]<<endl;

}

 

template<typename T>bool CStack<T>::isFull()

{

if(m_iStackTop == m_iLength)

return true;

return false;

}

 

template<typename T>bool CStack<T>::isEmpty()

{

if(m_iStackTop == 0)

return true;

return false;

}

 

template<typename T>void CStack<T>::pushStack(T _data)

{

if(!isFull())

m_pArray[m_iStackTop++] = _data;

}

 

template<typename T>T CStack<T>::popStack()

{

T result = 0;

if(!isEmpty())

{

result = m_pArray[--m_iStackTop];

m_pArray[m_iStackTop] = 0;

}

return result;

}

9.链表操作:

  #include "Utility.h"

 

//----节点的描述方式:通过结构体实现----

typedef struct stNode

{

int iValue; //节点数据域

stNode * pNext; //节点的指针域

}NODE, *LPNODE;

 

LPNODE pHead = NULL; //链表的头节点

LPNODE pTail = NULL; //链表的尾节点

 

 

//---显示链表中的所有元素---

void showList()

{

if(pHead == NULL)

cout<<"链表为空......"<<endl;

 

LPNODE pTemp = pHead;

while (pTemp) //通过链表头节点遍历链表所有元素

{

cout<<pTemp->iValue<<endl;

pTemp = pTemp->pNext; //指针下移

}

}

 

//----在链表头插入数据----

void insertNodeAtFront( int iData )

{

if(pHead == NULL) //链表中无节点

{

LPNODE pNode = new NODE;

pNode->iValue = iData;

pNode->pNext = NULL;

pHead = pNode;

pTail = pNode;

}

else //链表中已经存在节点

{

LPNODE pNode = new NODE;

pNode->iValue = iData;

pNode->pNext = pHead;

pHead = pNode;

}

}

//----在链表尾部插入数据----

void insertNodeAtBack( int iData )

{

if(pHead == NULL)

{

LPNODE pNode = new NODE;

pNode->iValue = iData;

pNode->pNext = NULL;

pHead = pNode;

pTail = pNode;

}

else

{

//1、创建该节点

LPNODE pNode = new NODE;

pNode->iValue = iData;

pNode->pNext = NULL;

 

//2、将该节点链接入链表

pTail->pNext = pNode;

pTail = pNode;

}

}

 

 

//----在链表中删除头节点元素----

int deleteNodeAtFront()

{

//链表中仅剩1个节点

if( pHead == pTail )

{

Safe_Delete(pHead);

pTail = NULL;

return 0;

}

 

LPNODE pTemp = pHead;

pHead = pHead->pNext;

int iResult = pTemp->iValue;

Safe_Delete(pTemp);

return iResult;

}

 

//----在链表中删除尾节点元素----

int deleteNodeAtBack()

{

//链表中仅剩1个节点

if( pHead == pTail )

{

Safe_Delete(pTail);

pHead = NULL;

return 0;

}

 

//让pDeleteNode指向尾节点

LPNODE pDeleteNode = pTail;

//通过遍历找到尾节点的前一个节点

LPNODE pTempNode = pHead;

while(pTempNode)

{

if(pTempNode->pNext == pTail)

{

pTail = pTempNode;

pTail->pNext = NULL;

break;

}

else

pTempNode = pTempNode->pNext;

}

 

//删除节点

int iResult = pDeleteNode->iValue;

Safe_Delete(pDeleteNode);

 

return iResult;

}

 

 

-----2015.6.4----在链表中删除指定元素----------

//int deleteNode( int iData )

//{

//LPNODE pTemp = pHead;

//int iResult = 0;

//while(pTemp)

//{

////单独判定头节点是否为我们要删除的节点

//if(pTemp->iValue == iData)

//{

//LPNODE pDeleteNode = pTemp;

//pTemp = pTemp->pNext;

//pHead = pHead->pNext;

//iResult = pDeleteNode->iValue;

//Safe_Delete(pDeleteNode);

//continue;

//}

//else//头节点不是我们要删除的节点

//{

//if(pTemp->pNext)

//{

//if( pTemp->pNext->iValue == iData )

//{

//LPNODE pDeleteNode = pTemp->pNext;

//pTemp->pNext = pDeleteNode->pNext;

//

//iResult = pDeleteNode->iValue;

//Safe_Delete(pDeleteNode);

//}

//}

//pTemp = pTemp->pNext;

//}

//}

//

//return iResult;

//}

 

 

void deleteNode(int iData)

{

if(!pHead)

return;

 

//定义一对儿 “伴生” 指针

LPNODE pPrevious = pHead;

LPNODE pLast  = pHead->pNext;

 

while( pLast )

{

//1.头节点是否为要删除的节点

if(pPrevious->iValue == iData)

{

pHead = pHead->pNext;

LPNODE pDeleteNode = pPrevious;

pPrevious = pPrevious->pNext;

pLast = pLast->pNext;

 

Safe_Delete(pDeleteNode);

continue;

}

else  

{

if(pLast->iValue == iData)

{

if( pLast == pTail )

{

pPrevious->pNext = NULL;

Safe_Delete(pLast);

 

pTail = pPrevious;

break;

}

pPrevious->pNext = pLast->pNext;

LPNODE pDeleteNode = pLast;

pLast = pLast->pNext;

Safe_Delete(pDeleteNode);

continue;

}

else

{

pPrevious = pPrevious->pNext;

pLast = pLast->pNext;

}

}

}

}

void main()

{

//showList();

//cout<<"--------在链表头部插入数据--------"<<endl;

//insertNodeAtFront(5);

//insertNodeAtFront(10);

//showList();

//cout<<"--------在链表尾部插入数据--------"<<endl;

//insertNodeAtBack(101);

//showList();

//cout<<"--------在链表头部删除数据--------"<<endl;

//cout<<"删除的元素值为:"<<deleteNodeAtFront()<<endl;

//showList();

//cout<<"--------在链表尾部删除数据--------"<<endl;

//cout<<"删除的元素值为:"<<deleteNodeAtBack()<<endl;

//showList();

//cout<<"--------在链表尾部删除数据--------"<<endl;

//cout<<"删除的元素值为:"<<deleteNodeAtFront()<<endl;

//showList();

//------------2015.6.4--------------

//insertNodeAtBack(10);

//insertNodeAtBack(20);

//insertNodeAtBack(30);

//insertNodeAtBack(10);

//insertNodeAtBack(40);

//showList();

//cout<<"----------删除元素值为30的节点----------"<<endl;

//deleteNode(30);

//showList();

cout<<"----------删除元素值为10的节点----------"<<endl;

deleteNode(40);

showList();

system("pause");

}

10.数据结构队列:

   #include "Utility.h"

/*

队列的作用:

   Windows编程中,所有的"消息"都是靠"队列"来存储

并逐个处理

*/

//--------顺序队列--------

class COrderQueue

{

protected:

int m_iQueue[5];

int m_iHeadIndex;

int m_iTailIndex; //最后一个有效元素的下标

public:

COrderQueue()

{

memset(m_iQueue,0,5*sizeof(int));

m_iHeadIndex = m_iTailIndex = 0;

}

void showQueue();

void push_back(int _data);

int  pop_front();

};

void COrderQueue::showQueue()

{

if( m_iQueue[m_iHeadIndex] == 0 )

{

cout<<"空队列"<<endl;

return ;

}

for(int i = m_iHeadIndex ; i <= m_iTailIndex ; ++i)

{

cout<<"队列["<<i<<"] = "<<m_iQueue[i]<<endl;

}

}

void COrderQueue::push_back(int _data)

{

//队列已满

if( m_iTailIndex == 5-1 )

{

cout<<"队列已满,无法插入数据"<<endl;

return;

}

//队列为空

if( m_iQueue[m_iHeadIndex] == 0 )

{

m_iQueue[m_iHeadIndex] = _data;

}

else

{

m_iQueue[++m_iTailIndex] = _data;

}

}

int  COrderQueue::pop_front()

{

//队列为空

if( m_iQueue[m_iHeadIndex] == 0 )

{

cout<<"队列为空,无法出队列"<<endl;

return 0;

}

 

//队列不为空,记录出队列的数据

int iRemove = m_iQueue[m_iHeadIndex];

 

//元素移动

for(int i = m_iHeadIndex + 1 ; i <= m_iTailIndex ; ++i )

{

m_iQueue[i-1] = m_iQueue[i];

}

 

//原始队列最后一个有效数据赋值为0,并前移动m_iTailIndex

m_iQueue[m_iTailIndex--] = 0;

 

return iRemove;

}

 

 

//--------链式队列--------

typedef struct stNode

{

int iData;

stNode * pNext;

}NODE,*LPNODE;

class CListQueue

{

protected:

LPNODE m_pHead; //头

LPNODE m_pTail; //尾

public:

CListQueue(){m_pHead = m_pTail = NULL;}

void showQueue();

void push_back(int _data);

LPNODE pop_front();

};

 

void CListQueue::showQueue()

{

if(!m_pHead)

{

cout<<"队列为空,无法显示"<<endl;

return;

}

 

LPNODE pTemp = m_pHead;

while(pTemp)

{

cout<<pTemp->iData<<endl;

pTemp = pTemp->pNext;

}

}

void CListQueue::push_back(int _data)

{

LPNODE pNode = new NODE();

pNode->iData = _data;

pNode->pNext = NULL;

 

//空队列

if(!m_pHead)

{

m_pHead = pNode;

m_pTail = pNode;

}

else

{

m_pTail->pNext = pNode;

m_pTail = pNode;

}

}

LPNODE CListQueue::pop_front()

{

//队列为空

if(!m_pHead)

{

cout<<"队列为空,无法出队列"<<endl;

return NULL;

}

 

LPNODE pRemove = NULL;

 

如果队列仅有1个元素

//if( m_pHead == m_pTail )

//{

//pRemove = m_pHead;

//m_pHead = m_pHead->pNext;

//m_pTail = m_pTail->pNext;

 

//pRemove->pNext = NULL;

//}

//else//至少有2个元素

//{

pRemove = m_pHead;

m_pHead = m_pHead->pNext;

pRemove->pNext = NULL;

//}

 

//仅有1个元素

if( pRemove == m_pTail )

{

m_pTail = NULL;

}

 

return pRemove;

}

 

 

 

void main()

{

//--------顺序队列的调用--------

COrderQueue queue;

 

queue.push_back( 5);

queue.push_back(10);

queue.push_back(15);

queue.push_back(20);

queue.push_back(25);

 

queue.showQueue();

 

cout<<"出队列元素为:"<<queue.pop_front()<<endl;

queue.showQueue();

 

//--------链式队列的调用--------

cout<<"--------链式队列的调用--------"<<endl;

CListQueue listQueue;

listQueue.push_back( 5);

listQueue.push_back(10);

listQueue.push_back(15);

listQueue.showQueue();

 

cout<<"出队列的元素为:"<<listQueue.pop_front()->iData<<endl;

listQueue.showQueue();

 

cout<<"出队列的元素为:"<<listQueue.pop_front()->iData<<endl;

listQueue.showQueue();

 

cout<<"出队列的元素为:"<<listQueue.pop_front()->iData<<endl;

listQueue.showQueue();

 

system("pause");

}

11.链栈:

   #include "Utility.h"

 

template <typename T> class NODE

{

public:

T iData;

NODE<T> * pNext;

};

 

template <typename T> class CStack

{

protected:

NODE<T> * pHead;

NODE<T> * pTail;

public:

CStack();

void showStack(); //显示栈元素

void push_Stack(T _data); //入栈

NODE<T> * pop_Stack(); //出栈

};

 

template<typename T>

CStack<T>::CStack()

{

pHead = NULL;

pTail = NULL;

}

 

template<typename T>

void CStack<T>::showStack()

{

if(pHead == NULL)

cout<<"栈为空"<<endl;

 

NODE<T> * pTemp = pHead;

while(pTemp)

{

cout<<pTemp->iData<<endl;

pTemp = pTemp->pNext;

}

}

 

template<typename T>

void CStack<T>::push_Stack(T _data)

{

NODE<T> *  pNode = new NODE<T>();

pNode->iData = _data;

pNode->pNext = NULL;

if(pHead == NULL) //当链栈为空时

{

pHead = pNode;

pTail = pNode;

}

else //链栈不为空

{

pNode->pNext = pHead;

pHead = pNode;

}

}

 

template<typename T>

NODE<T> *  CStack<T>::pop_Stack()

{

//如果栈内没有元素

if(pHead == NULL)

{

cout<<"栈内无元素,无法出栈"<<endl;

return NULL;

}

 

NODE<T> *  pRemoveNode = NULL;

 

//如果栈内有且仅有1个元素

if(pHead->pNext == NULL)

{

pRemoveNode = pHead;

pHead = pTail = NULL;

return pRemoveNode;

}

 

//栈内具有多个元素

pRemoveNode = pHead;

pHead = pHead->pNext;

pRemoveNode->pNext = NULL;

return pRemoveNode;

}

 

 

/*

struct就是C语言时代的"类"

class 是C++语言时代的"类"

联系:都可以带构造函数,

区别是:struct默认访问权限是:public

    class默认访问权限是:private

*/

struct stPlayer

{

string name;

int iLevel;

 

//结构体的构造函数

stPlayer(){ name = "" ; iLevel = 1;}

stPlayer(string _name,int _level)

{

name = _name;

iLevel = _level;

}

};

 

 

void main()

{

//--------int型链栈--------

cout<<"--------int型链栈--------"<<endl;

CStack<int> intStack;

 

intStack.push_Stack(5);

intStack.push_Stack(10);

intStack.push_Stack(15);

 

intStack.showStack();

 

NODE<int> * pRemoveNode = intStack.pop_Stack();

cout<<"出栈元素为:"<<pRemoveNode->iData<<endl;

intStack.showStack();

 

pRemoveNode = intStack.pop_Stack();

cout<<"出栈元素为:"<<pRemoveNode->iData<<endl;

intStack.showStack();

 

pRemoveNode = intStack.pop_Stack();

cout<<"出栈元素为:"<<pRemoveNode->iData<<endl;

intStack.showStack();

 

//--------float型链栈--------

cout<<"--------float型链栈--------"<<endl;

CStack<float> floatStack;

floatStack.push_Stack(1.5f);

floatStack.push_Stack(3.5f);

floatStack.push_Stack(5.5f);

 

floatStack.showStack();

 

NODE<float> * pRemove = floatStack.pop_Stack();

cout<<"出栈元素为:"<<pRemove->iData<<endl;

floatStack.showStack();

 

pRemove = floatStack.pop_Stack();

cout<<"出栈元素为:"<<pRemove->iData<<endl;

floatStack.showStack();

 

pRemove = floatStack.pop_Stack();

cout<<"出栈元素为:"<<pRemove->iData<<endl;

floatStack.showStack();

 

//--------结构体类型的链栈----------

CStack<stPlayer> playerStack;

playerStack.push_Stack(stPlayer());

playerStack.push_Stack(stPlayer("xiaohong",1));

system("pause");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值