c++实现栈的基本操作

原创 2016年06月01日 19:01:20

  1. 栈的定义

        栈(Stack)又称堆栈,是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。

     栈有两种实现的方式。一种是顺序存储,和数组类似;一种是链式存储,和单链表类似。

wKiom1cJAafxAH8-AABXBkMBS7I061.png

   下面主要用顺序存储去实现它,和链式存储相比,主要有下面几个优点:

    (1)方便我们进行管理;数组就是只可以在一边进行操作。

    (2)应用顺序存储的效率比较高。假如用链式存储的话,在插入删除等操作时,需要遍历整个链表,比较浪费时间;还有一点是CPU的高速缓存的利用率低,每次操作往高级缓存中加载时会多加载一些没有用的空间,不仅浪费时间,还容易“污染”内存。

2.栈的主要的函数接口

void Push(const T & s);//插入数据
void Pop();//删除数据
bool empty();//判断是否为空
size_t size();//元素个数
T & Top();//取出最后进入的元素但不删除
void print();//输出函数

3.栈的定义

template <typename T>//定义为模板类,实现不同的数据存储

class Stack
{
    public:
        Stack()//构造函数
		:_ptr(NULL)
		, _top(0)
		,_capacity(0)
	{

	}
	Stack(const Stack<T> & s)//拷贝构造
	{
		_capacity = s._capacity;
		_top = s._top;
		_ptr = new T[_capacity];
		for (size_t i = 0; i < _top; i++)//不能使用memcpy函数,(必须考虑浅拷贝的                                                 //问题)
		{
		    _ptr[i] = s._ptr[i];
		}
	}
	Stack <T> & operator=(const Stack<T> & s)//赋值运算符的重载
	{
		if (_capacity < s._capacity)//判断容量是否足够
		{
		    _capacity = s._capacity;
		    _ptr = new T[_capacity];
		}
		_top = s._top;
		for (size_t i = 0; i < _top; i++)
		{
		    _ptr[i] = s._ptr[i];
		}
		return *this;
	}
	~Stack()//析构函数
	{
		if (_ptr)
		{
		    delete _ptr;
		}
	}
    protected:
	T * _ptr;//保存数据的指针
	size_t _top;//存储的数据个数
	size_t _capacity;//开辟的容量
}

4.接口的实现

	void Push(const T & s)//插入数据
	{
		_Check_capacity();//使用这个函数判断是否需要开辟空间
		_ptr[_top] = s;
		_top++;
	}
	
	void Pop()//删除数据
	{
		if (_top)//必须保证数据个数不能为负数
		{
		        _top--;
		}
	}
	
	bool empty()//判空
	{
		return _top==0;
	}
	
	size_t size()//数据个数
	{
		return _top;
	}
	
	T & Top()//输出最后插入的数据
	{
		if (!empty())
		{
			return _ptr[_top-1];
		}
	}
	
	void print()//输出
	{
		for (size_t i = _top; i > 0; --i)
		{
			cout << _ptr[i-1] << " ";
		}
		cout << endl;
	}

5.测试结果

void testStack()
{
	Stack<int> s1;
	s1.Push(0);
	s1.Push(1);
	s1.Push(2);
	s1.Push(3);
	s1.print();//输出结果3 2 1 0
	s1.Pop();
	s1.print();//输出结果2 1 0
	cout << s1.empty() << endl;//输出结果0
	cout << s1.size() << endl;//输出结果 3
	cout << s1.Top() << endl;//输出结果 2
}

wKioL1cJB5mgyEuuAAAP5gBRHS8081.png

本文出自 “不断进步的空间” 博客,请务必保留此出处http://10824050.blog.51cto.com/10814050/1762161

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

C++栈和队列

使用标准库的栈和队列时,先包含相关的头文件 #include #include 定义栈如下: stack stk; 定义队列如下: queue q; 栈提供了如下的操作 s.empty...

c++ -- 栈和队列的基本操作

在C++标准库(STL)中,实现了栈和队列,方便使用,并提供了若干方法。以下作简要介绍。 1、栈(stack)说明及举例: 使用栈,要先包含头文件 : #include 定义栈,以如...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C++实现顺序栈的基本功能

栈是限定仅在表头进行插入和删除操作的线性表,有着先进后出的特点(FILO); 现在我来动手实现栈的基本本功能练练手; 定义栈的头文件如下: #ifndef CSTOCK_H_ #define C...

C++栈的用法及栈的实现

首先看一下原c++栈的方法的基本用法: push(): 向栈内压入一个成员; pop(): 从栈顶弹出一个成员; empty(): 如果栈为空返回true,否则返回false; t...

C++栈类的实现

#ifndef _CStack #define _CStack #include template class CStack{ // LIFO 对象 public : CStack(int MaxSt...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C++实现栈

栈只允许在末端进行插入和删除的线性表。栈具有后进先出的特性(LIFO,Last In First Out)。#pragma once #include template class Stack { ...

C++算法之 自己写一个简单的栈Stack

// Stack.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include using namespace std; enum{CO...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++实现栈的基本操作
举报原因:
原因补充:

(最多只允许输入30个字)