C++資料結構之棧和佇列
阿新 • • 發佈:2019-02-04
棧和佇列也是常用的資料結構。棧“先進後出”的性質使得它有很多的應用,如果你學過組合語言,在設計程式時,中斷出現,要響應中斷,那麼程式中的重要暫存器資訊就要壓入棧中,等中斷程式執行完把斷點處的資訊出棧;另外,如果你要用控制檯設計一個計算器程式,即你輸入一系列運算數和運算子,要得到運算結果,通常也會用到棧操作,如果你知道波蘭演算法,那麼通過棧可以實現逆波蘭演算法,從而完成計算器的設計。佇列的作用很明顯,先進先出就像排隊一樣,在網路中請求和回覆、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;
}