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
#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
#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;
}











 
  
 
  
 
 

你可能感兴趣的:(C++与数据结构的学习)