C++栈的顺序存储和链式存储的实现

栈是最常见的数据结构,其特点是后进先出(Last In First Out)也是链表的特殊形式,所以和链表一样,有两种存储方式,第一是顺序存储的栈,方便快速读写数据,但是栈的长度必须先固定;第二种是链式存储的栈,可以不用定义栈的长度,可以大量插入数据,如果不是物理内存使用完的话,可以存储大量的数据。

首先,顺序存储的栈的实现,代码如下:

#pragma once
#define MAXSIZE 10
template<typename EleType>
class OrderStack
{

public:
	OrderStack();
	~OrderStack();
	bool GetTop(EleType& e);
	bool Push(const EleType& e);
	bool Pop(EleType& e);
	void Show()const;
private:
	EleType data[MAXSIZE];
	int top;
	bool Empty()const;
	bool Full()const;
	int StackLength()const;
};
#include "OrderStack.h"
#include <iostream>
using namespace std;
template<typename EleType>
bool OrderStack<EleType>::Pop(EleType& e)
{
	if (Empty())
	{
		cout << "The stack is empty!\n";
		return false;
	}
	e = data[top];
	--top;
	return true;
}

template<typename EleType>
bool OrderStack<EleType>::Push(const EleType& e)
{
	if (Full())
	{
		return false;
	}
	++top;
	data[top] = e;
	return true;
}

template<typename EleType>
bool OrderStack<EleType>::GetTop(EleType& e)
{
	if (Empty())
	{
		return false;
	}
	e = data[top];
	return true;
}

template<typename EleType>
OrderStack<EleType>::~OrderStack()
{

}

template<typename EleType>
OrderStack<EleType>::OrderStack() :top(-1)
{

}

template<typename EleType>
int OrderStack<EleType>::StackLength() const
{
	return top + 1;
}

template<typename EleType>
bool OrderStack<EleType>::Full() const
{
	return (top == MAXSIZE - 1);
}

template<typename EleType>
bool OrderStack<EleType>::Empty() const
{
	return (top == -1);
}

template<typename EleType>
void OrderStack<EleType>::Show() const
{
	if (Empty())
	{
		cout << "The stack is Empty!\n";
		return;
	}
	cout << "The stack length is: " << StackLength() << endl;
	cout << "The stack is: ";
	for (int i = top; i >= 0;--i)
	{
		cout << data[i] << " ";
	}
	cout << endl;
}

第二,栈的链式存储,代码如下:

#pragma once
template<typename EleType>
class ChainStack
{
public:
	ChainStack();
	~ChainStack();
	bool GetTop(EleType& e);
	bool Push(const EleType& e);
	bool Pop(EleType& e);
	void Show()const;
private:
	bool Empty()const;
	//bool Full()const;
	int StackLength()const;
	struct Node
	{
		EleType data;
		Node* next;
		Node(){ next = nullptr; }
	};
	Node* top;
	int length;
};
#include "ChainStack.h"
#include <iostream>
using namespace std;

template<typename EleType>
int ChainStack<EleType>::StackLength() const
{
	return length;
}

// template<typename EleType>
// bool ChainStack<EleType>::Full() const
// {
//
// }

template<typename EleType>
bool ChainStack<EleType>::Empty() const
{
	return (length == 0);
}

template<typename EleType>
void ChainStack<EleType>::Show() const
{
	if (Empty())
	{
		cout << "The stack is empty!\n";
		return;
	}
	cout << "The stack length is " << length << endl;
	cout << "The stack is ";
	Node* temp=top;
	for (int i = 1; i <= length;++i)
	{
		cout << temp->data << " ";
		temp = temp->next;
	}
	cout << endl;
}

template<typename EleType>
bool ChainStack<EleType>::Pop(EleType& e)
{
	if (Empty())
	{
		cout << "The stack is empty!\n";
		return false;
	}
	e = top->data;
	Node* temp = top;
	top = top->next;
	--length;
	delete temp;
	return true;
}

template<typename EleType>
bool ChainStack<EleType>::Push(const EleType& e)
{
	Node* temp = new Node;
	temp->data = e;
	if (Empty())
	{
		top = temp;
	}
	else
	{
		temp->next = top;
		top = temp;
	}
	++length;
	return true;
}

template<typename EleType>
bool ChainStack<EleType>::GetTop(EleType& e)
{
	if (Empty())
	{
		cout << "The stack is empty!\n";
		return false;
	}
	e = top->data;
	return true;
}

template<typename EleType>
ChainStack<EleType>::~ChainStack()
{
	Node* temp = top;
	while (top)
	{
		temp = top;
		top = temp->next;
		delete temp;
	}

}

template<typename EleType>
ChainStack<EleType>::ChainStack() :length(0), top(nullptr)
{

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 18:30:53

C++栈的顺序存储和链式存储的实现的相关文章

队列的定义与操作——顺序存储和链式存储

队列的 存储结构 有 顺序存储 和 链式存储. 1. 队列的顺序存储与操作 (循环队列) 1 typedef int Position; 2 struct QNode { 3 ElementType *Data; // 存储元素的数组 4 Position Front, Rear; // 队列的 头.尾指针 5 int Cap; // 队列最大大容量 6 }; 7 typedef struct QNode *Queue; 8 9 // 操作集 10 Queue CreateQueue(int M

数据结构导论 四 线性表的顺序存储VS链式存储

前几章已经介绍到了顺序存储.链式存储 顺序存储:初始化.插入.删除.定位 链式存储:初始化.插入.删除.定位 顺序存储:初始化 strudt student{ int ID://ID char name[30];//姓名 char sex; //性别 int class;//班级 int age;//年龄 } student={"01",“zhangsan”,"m","201","20"}: 链式存储:初始化 //建立一个空链

4、栈的实现:顺序存储和链式存储

Stack的ADT: 1 package ren.laughing.datastructure.base; 2 3 import ren.laughing.datastructure.exception.StackEmptyException; 4 5 /** 6 * Stack 栈:后进先出 7 * 只能在栈顶top进行插入(入栈).删除(出栈)操作 8 * @author Laughing_Lz 9 * @time 2016年4月6日 10 */ 11 public interface St

数据结构学习笔记(二) 线性表的顺序存储和链式存储

线性表:由同类型数据元素构成有序序列的线性结构 -->表中元素的个数称为线性表的长度 -->没有元素时,成为空表 -->表起始位置称表头,表结束位置称表尾 顺序存储: 1 package test; 2 3 /** 4 * 线性表(数组) 5 * 6 */ 7 public class Test { 8 private static int m ; 9 private static int[] a; 10 public static void main(String[] args) {

线性表的顺序存储和链式存储

顺序存储是分配了一块连续的内存,把这块内存平均分为N份,每份存放一个线性表的单元.从内存利用角度讲,顺序存储需要的是一块连续的内存.特点是查找节点容易,插入. 删除节点比较耗时. 链式存储是分配了几个零散的非连续单元,从内存利用角度讲,它能充分利用那些碎片化的内存.特点是查找节点慢,但插入删除节点快. 怎么理解呢? 下文说的酒店均没有客户记录,就是没有登记某个人住在某个房间. 顺序存储就和某个酒店的一层房间,比如在第一层有100个房间,从1号房间按顺序一致排到底100号房间.你去找一个人,打开1

数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)

一,线性表顺序存储 #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #include <io.h> #include <math.h> #include <time.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSI

C 数据结构1——线性表分析(顺序存储、链式存储)

之前是由于学校工作室招新,跟着大伙工作室招新训练营学习数据结构,那个时候,纯碎是小白(至少比现在白很多)那个时候,学习数据结构,真的是一脸茫然,虽然写出来了,但真的不知道在干嘛.调试过程中,各种bug也不懂怎么修改,那个时候,电脑一直被我弄蓝屏,这个寒假,重新学习一遍数据结构,获益良多,整理一下,发布出来,求拍砖,共同进步. 线性表(List),0个或者多个数据元素的有限序列 线性表的顺序存储,即线性表通过数组的方式实现,指用一段地址连续的存储单元一次存储线性表的数据元素.如图: A1 A2 -

3-7-队列的链式存储-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 队列的链式存储 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h        相关测试数据下载  链接? 无数据    

线性表的链式存储结构——(2)

线性表的存储结构有两种:顺序存储和链式存储 顺序存储:读取数据的时间复杂度为O(1),其实就是数组,但是插入,删除的复杂度略大 链式存储:•用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置. 数据域:存储数据元素信息的域 指针域:把存储直接后继位置的域 指针或链:指针域中存储的信息 结点(Node):数据域和指针域组成数据元素称为存储映像 单链表:链表的每个结点中只包含一个指针域 •头指针 –头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点