栈、队列的C++实现

#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <exception>

using namespace std;

class MyException : public exception
{
public:
	MyException() :exception("the stack is empty...\n")
	{

	}
	MyException(int a) :exception("the queue is empty...\n")
	{

	}
};

template <typename T>
class Stack
{
	int Size;
	int Room;
	T* data;
public:
	Stack()
	{
		Size = 0;
		Room = 0;
		data = NULL;

	}
	Stack(int MAX)
	{
		Size=0;
		Room = MAX;
		data = (T*)malloc(sizeof(T)*MAX);
	}

	int size()
	{
		return Size;
	}

	int room()
	{
		return Room;
	}

	void push(T m)
	{
		if(Room>Size)
		{
			*(data+Size)=m;
			++Size;
		}
		else
		{
			data = (T*)realloc(data,(Room+100)*sizeof(T));
			*(data+Size)=m;
			++Size;
			Room+=100;
		}
	}

	void pop()
	{
		try
		{
			if (Size)
			{
				--Size;
			}
			else
				throw MyException();
		}
		catch (MyException &e)
		{
			cout << e.what();
		}
	}

	T getTop()
	{
		try
		{
			if (Size)
			{
				return *(data + Size - 1);
			}
			else
				throw MyException();
		}
		catch (MyException &e)
		{
			cout << e.what();
		}
	}

	void clear()
	{
		Size=0;
		Room=0;
		free(data);
		data=NULL;
	}
	bool isEmpty()
	{
		if (!Size)return true;
		else return false;
	}

};

template <typename T>
class Queue
{
	int Size;
	int Room;
	int Head;
	T* data;
public:
	Queue()
	{
		Size = 0;
		Room = 0;
		Head = 0;
		data = NULL;
	}
	Queue(int MAX)
	{
		Size = 0;
		Room = MAX;
		Head = 0;
		data = (T*)malloc(sizeof(T)*MAX);
	}
	int size()
	{
		return Size;
	}
	int room()
	{
		return Room;
	}
	void enqueue(T m)
	{
		if (Room > Size)
		{
			*(data + Room - Size -1) = m;
			++Size;
		}
		else
		{
			T* temp = (T*)malloc(sizeof(T)*(Room + 100));
			memcpy(temp + 100, data, sizeof(T)*Room);
			data = temp;
			Room += 100;
			*(data + Room - Size -1) = m;
			++Size;
		}
	}

	void dequeue()
	{
		try
		{
			if (Size)
			{
				--Size;
				++Head;
			}
			else
				throw MyException(0);
		}
		catch (MyException &e)
		{
			cout << e.what();
		}
	}

	T getHead()
	{
		try
		{
			if (Size)
			{
				return *(data + Room -Head -1);
			}
			else throw MyException(0);
		}
		catch (MyException &e)
		{
			cout << e.what();
		}
	}

	void clear()
	{
		Size = 0;
		Room = 0;
		Head = 0;
		free(data);
		data = NULL;
	}
	bool isEmpty()
	{
		if (Size)return false;
		else return true;
	}
};

int main(int argc, char* argv[])
{
	cout << "/*test of my stack*/\n\n";
	cout << "***********************\n";
	Stack<int> s;

	cout << "the stack has: " << s.size() << " elements...\n";
	cout << "the stack can contain: " << s.room() << " elements...\n";

	for (int i = 0; i < 100; ++i)
		s.push(i);
	cout << "the stack has: " << s.size() << " elements...\n";
	cout << "the stack can contain: " << s.room() << " elements...\n";

	s.push(30);
	cout << "the stack has: " << s.size() << " elements...\n";
	cout << "the stack can contain: " << s.room() << " elements...\n";

	cout << "the top element is " << s.getTop() <<"...\n";

	s.pop();
	cout << "the top element is " << s.getTop() << "...\n";

	cout << "the stack is empty? " << s.isEmpty()<<"...\n";

	s.clear();
	cout << "the stack is empty? " << s.isEmpty() <<"...\n\n";

	cout << "/*test of my queue*/\n\n";
	cout << "***********************\n";
	Queue<int> t;

	cout << "the queue has: " << t.size() << " elements...\n";
	cout << "the queue can contain: " << t.room() << " elements...\n";

	for (int j = 0; j < 100; ++j)
		t.enqueue(j);
	cout << "the queue has: " << t.size() << " elements...\n";
	cout << "the queue can contain: " << t.room() << " elements...\n";

	t.enqueue(-1);
	cout << "the queue has: " << t.size() << " elements...\n";
	cout << "the queue can contain: " << t.room() << " elements...\n";

	cout << "the top element is " << t.getHead() <<"...\n";

	t.dequeue();
	cout << "the queue has: " << t.size() << " elements...\n";
	cout << "the queue can contain: " << t.room() << " elements...\n";
	cout << "the top element is " << t.getHead() << "...\n";

	cout << "the queue is empty? " << t.isEmpty()<<"...\n";

	t.clear();
	cout << "the queue is empty? " << t.isEmpty() <<"...\n";

	return 0;
}

//栈的结构通过连续内存(数组)来模拟,数组的尾端相当于栈顶
//出栈操作并没有将栈顶元素删除,只是通过Size自减1,使得原栈顶元素无法访问
//队列的结构同样也是通过连续内存(数组)来模拟,数组的尾端相当于队首
//出列操作也同样没有将队首元素删除,只是通过Head自加1,使得原队首元素无法访问

  

时间: 2024-10-12 12:21:58

栈、队列的C++实现的相关文章

&lt;数据结构与算法分析 C++描述&gt; 表/栈/队列

这一章主要内容: * 抽象数据类型(ADT)的概念 * 实现表/栈/队列 * 了解这三个数据结构的应用场景 1. ADT ADT: abstract data type, 是抽象的数学模型,在该模型上定义了一系列的操作.使用它的人,不需要了解它的存储方式,只关心它的逻辑特征.可以使用三元组的方法来表示(D,S,P),D是数据对象,S是数据之间的关系,P是对数据的基本操作,具体介绍,可以参考帖子:点击打开链接 2. 表ADT 表的数据自然是单个元素,而元素之间的关系是前驱与后继,操作包括查找/插入

栈&队列的简单实现

栈的定义---Stack 栈只允许在栈的末端进行插入和删除的线性表.栈具有先进后出的特性. 栈可用顺序表实现也可用链表实现. 但: 由于栈只能在末端进行操作,应使用顺序表实现. 用顺序表实现,有如下优点: (1)方便管理 (2)效率高 (3)cpu高速缓冲存取利用率高 实现如下: 测试如下: 队列的定义---Queue 队列只允许在队尾插入,队头删除.具有先进先出的特性. 队列的实现可用顺序表也可用链表. 若采用顺序表,删除时需要移动元素.为了操作方便,采取链表实现. 实现如下: 测试如下: 栈

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

C语言栈队列实现二-十/二-八进制转换

C语言栈队列实现二-十/二-八进制转换 2015-04-05 Lover雪儿 1 //利用栈来求取二进制数的十进制与八进制的结果 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <math.h> 5 6 #define STACK_INIT_SIZE 20 //初始栈大小 7 #define STACK_INCREMENT 10 //扩充栈时每次增加的内存 8 9 typedef char ElemType;

java面向对象的栈 队列 优先级队列的比较

栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多.在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务:当完成任务之后,他们就会被销毁.这三个数据结构还有一个特点就是访问是受到限制的,即在特定时刻只有一个数据项可以被读取或者被删除,但是所谓的移除并不是真的删除,数据项依然在这些数据结构中,只不过因为指针已经指向其他数据项,没有办法访问到,当添加新的数据项时,当初移除的数据项被替代从而永远消失. 栈 队列 优先级队列的模拟思想 1.栈:栈遵循先进后出(F

java 集合 Connection 栈 队列 及一些常用

800x600 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priori

【C++】c++中栈 队列 的应用

C++中提供了STL模板statck 在使用的时候更为方便 除了一般的队列外 还有STL更有双向队列可以使用 #include<deque> 声明:deque <type > name 应用举例1:铁轨问题 Description There is a famous railway station in PopPush City. Country there is incredibly hilly. The station was built in last century. Un

【BZOJ2783】[JLOI2012]树 DFS+栈+队列

[BZOJ2783][JLOI2012]树 Description 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深度为1.路径不必一定从根节点开始. Input 第一行是两个整数N和S,其中N是树的节点数. 第二行是N个正整数,第i个整数表示节点i的正整数. 接下来的N-1行每行是2个整数x和y,表示y是x的儿子. Output 输出路径节点总和为S的路径数量. Sa

数据结构录 之 链表&amp;栈&amp;队列

三种基本的数据结构,来稍微说一下. 首先链表,这个几乎每本C++的语言书都会说的,直接看书上说的就好. 链表就是一个链,每一个都有一个指针指向下一个,然后这样串了起来.然后可以从头开始找,一直找到尾巴.然后对于某个数据点,都可以删除,只需要让他前面那个指向他后面那个,这样从头开始找的时候就找不到这个点了...在这个点之后添加一个点也是这样,直接让这个点指向那个新的,然后让新的指向原来这个点指向的后一个... 可以想象就是一个个点,然后第一个指向第二个,第二个指向第三个...就像是一条长长的链一样

【STL】栈+队列+优先队列(详)+ 拯救行动题解

一.栈 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素. 说通俗一点,就是一种有口无肛门的数据结构 咳咳...是一种满足"后进先出"规则的数据结构.有PUSH和POP两种操作.PUSH:把元素压入栈顶 POP:把元