1. 程式人生 > >C++資料結構之棧和佇列

C++資料結構之棧和佇列


棧和佇列也是常用的資料結構。棧“先進後出”的性質使得它有很多的應用,如果你學過組合語言,在設計程式時,中斷出現,要響應中斷,那麼程式中的重要暫存器資訊就要壓入棧中,等中斷程式執行完把斷點處的資訊出棧;另外,如果你要用控制檯設計一個計算器程式,即你輸入一系列運算數和運算子,要得到運算結果,通常也會用到棧操作,如果你知道波蘭演算法,那麼通過棧可以實現逆波蘭演算法,從而完成計算器的設計。佇列的作用很明顯,先進先出就像排隊一樣,在網路中請求和回覆、CPU內部的指令佇列等等。好了,直接用C++實現它們吧~

一、棧


直接寫一個棧的類,可以把下面的程式碼放到一個stack.h的標頭檔案中,m_stack是動態申請的空間作為棧,m_top指向棧頂,m_ncount是棧的大小;我們在入棧操作時需要判斷棧是否滿了,即棧是否溢位。


bool isFull()


同樣要考慮出棧了,棧是否到了棧底。
bool isEmpty()
#pragma once
typedef int DATA;
class Stack
{
	DATA *m_stack;
	int m_ntop;
	int m_ncount;
public:
	Stack(int ncount = 5)
	{
		m_ncount = ncount;
		m_ntop = -1;
		m_stack = new DATA[m_ncount];
	}
	bool isFull()
	{
		return m_ntop+1 >= m_ncount;
	}
	bool isEmpty()
	{
		return m_ntop == -1;
	}
	void push(const DATA& data)
	{
		if (!isFull())
		{
			m_stack[++m_ntop] = data;
		}
	}
	bool pop(DATA &data)
	{
		if (!isEmpty())
		{
			data = m_stack[m_ntop--];
			return true;
		}
		return false;
	}
};



如果要測試這個棧我們可以在下面的程式碼中測試
#include<iostream>
#include"stack.h"
using namespace std;


int main()
{
	Stack s;
	int i = 0;
	while (i < 10)
	{
		s.push(i + 1);
		++i;
	}
	DATA data;
	while (i > 0)
	{
		if(s.pop(data))
			cout << data << endl;
	}
	return 0;
}



二、佇列


佇列我們做一個環形的佇列~同樣寫一個佇列類queue.h

#pragma once
typedef int DATA;
class Queue
{
	DATA *m_data;
	int m_ncount;
	int m_head;
	int m_tail;
public:
	//初始化列表預設佇列長度為6,但由於做成一個環形的佇列,所以實際上只有5個數據,還有一個地址作為結束標籤
	Queue(int ncount=6):m_ncount(ncount)
	{
		m_head = m_tail = 0;
		m_data = new DATA[ncount];
	}
	bool isFull()
	{
		return (m_tail+1)%6==m_head;
	}
	bool isEmpty()
	{
		return m_head==m_tail;
	}
	void push(const DATA& data)
	{
		if (!isFull())
		{ 
			m_data[m_tail] = data;
			//實際m_tail的範圍為0-5這樣6個數,當m_tail為5時表示它指向了標籤,要跳過標籤
			if (++m_tail >= m_ncount)
				m_tail = 0;
		}
	}
	bool pop( DATA &data)
	{
		if(!isEmpty())
		{ 
			data = m_data[m_head];
			if (++m_head >= m_ncount)
				m_head = 0;
			return true;
		}
		return false;
	}
};




測試程式碼:
#include<iostream>
#include"queue.h"
using namespace std;


int main()
{
	Queue q;
	int i = 0;
	while (i < 10)
	{
		q.push(i + 1);
		++i;
	}
	
	DATA data;
	q.pop(data);
	while (i >0)
	{
		if (q.pop(data))
			cout << data << endl;
		--i;
	}
	return 0;
}