关闭

数据结构探险—栈篇

标签:
227人阅读 评论(0) 收藏 举报
分类:

慕课网、、学习。

栈是一种机制,后进先出 LIFO: last in first out

栈的原理:


r任务

MyStack.h

#ifndef MYSTACK_H
#define MYSTACK_H


template<typename T>
class MyStack
{public:
	MyStack (int size);
	~MyStack ();
	bool stackEmpty ();
	bool stackFull ();
	void clearStack ();
	int stackLength ();    //已有元素个数
	bool push (T elem);  //元素入栈、栈顶上升
	bool pop (T &elem);   //出栈、栈顶下降
	void stackTraverse (bool isFromButtom);
private:
	T *m_pBuffer;  //指向栈空间
	int m_iSize;            //栈容量
	int m_iTop;  //栈顶、栈中元素个数


};
//#include<iostream>
//#include"stdlib.h"
//#include"MyStack.h"
//using namespace std;
template<typename T>
MyStack<T>::MyStack (int size)
{
	m_iSize = size;
	m_pBuffer = new T[size];
	m_iTop = 0;


}
template<typename T>
MyStack<T>::~MyStack ()
{
	delete[]m_pBuffer;
}
template<typename T>
bool MyStack<T>::stackEmpty ()
{
	if ( 0 == m_iTop )
	{
		return true;
	}
	return false;
}
template<typename T>
bool MyStack<T>::stackFull ()
{
	if ( m_iTop == m_iSize )
	{
		return true;


	}
	return false;
}
template<typename T>
void MyStack<T>::clearStack ()
{
	m_iTop = 0;
}
template<typename T>
int MyStack<T>::stackLength ()    //已有元素个数
{
	return m_iTop;
}
template<typename T>
bool MyStack<T>::push (T elem)  //元素入栈、栈顶上升
{
	if ( stackFull () )
	{
		return false;
	}
	m_pBuffer[m_iTop] = elem;
	m_iTop++;
	return true;
}


//char MyStack::pop ()   //出栈、栈顶下降 但出栈是char类型的、没有参数
//{
//	if ( stackEmpty () )
//	{
//		throw 1;
//	}
//	else
//	{
//		m_iTop--;
//	return m_pBuffer[m_iTop];
//	}
//	
//}
template<typename T>
bool MyStack<T>::pop (T &elem)   //出栈、栈顶下降 参数使用的是引用、就是说之后用这个函数的时候可以使用变量
{
	if ( stackEmpty () )
	{
		return false;
	}
	m_iTop--;
	elem = m_pBuffer[m_iTop];
	return true;
}
template<typename T>
void  MyStack<T>::stackTraverse (bool isFromButtom)//有一些是写了visit()函数指针作为参数,去访问复杂的栈中元素
{
	if ( isFromButtom )
	{
		for ( int i = 0; i < m_iTop; i++ )
		{
			cout << m_pBuffer[i];
			//m_pBuffer[i].printCoordinate ();
		}
	}
	else
	{
		for ( int i = m_iTop - 1; i >= 0; i-- )
		{
			cout << m_pBuffer[i];
			//m_pBuffer[i].printCoordinate ();
		}
	}


}
#endif
<pre name="code" class="cpp">Coordinate.h


#ifndef COORDINATE_H
#define COORDINATE_H
#include<ostream>
using namespace std;
class Coordinate
{
	friend ostream &operator<<(ostream &out, Coordinate &coor);
public:
	Coordinate (int x=0,int y=0);
	void printCoordinate ();
	
public:
	int m_iX;
	int m_iY;
};
#endif

Coordinate.cpp


#include"Coordinate.h"
#include"iostream"
using namespace std;
Coordinate::Coordinate (int x, int y)
{
	m_iX = x;
	m_iY = y;
	
}
void Coordinate::printCoordinate ()
{
	cout << "{" << m_iX << "," << m_iY<<"}" << endl;
}
ostream &operator<<(ostream &out, Coordinate &coor)
{
	out << "(" << coor.m_iX << ","<< coor. m_iY << ")" << endl;
	return out;
}
实例一


#define BINARY   2
#define OCTONARY 8
#define HEXADECIMAL 16
#include<iostream>
#include"stdlib.h"
#include"MyStack.h"
#include"Coordinate.h"
using namespace std;
int main (void)
{
	char num[] = "0123456789ABCDEF";  //因为十六进制有ABCDEF所以要想办法、num的索引10正好对应元素A
	MyStack<int> *pStaxk = new MyStack<int> (30);
	int N = 10;
	int mod = 0;
	while ( N != 0 )
	{
		mod = N% HEXADECIMAL;
		pStaxk->push (mod);//取余的数依次放入栈中
		N = N / HEXADECIMAL;  //得到下一个除完的数               //十进制转换成二进制十二进制十六进制
	}
	int elem = 0;
	while ( !pStaxk->stackEmpty () ) 只要栈不为空就输出
		
	{
		pStaxk->pop (elem); 把栈里面的取余得到的是依次出栈付给elem
		cout<<num[elem];  输出对应的元素
	}
	

	
	delete pStaxk;
	pStaxk = NULL;
	system ("pause");
		return 0;
}

实例二;


demo.cpp

include<iostream>
#include"stdlib.h"
#include"MyStack.h"
#include"Coordinate.h"
using namespace std;
int main (void)
{
	MyStack<char> *pStaxk = new MyStack<char> (30); 
	MyStack<char> *pneedStaxk = new MyStack<char> (30);
	char str[] = "[()]]";
	char currentNeed = 0;  //当前急需要匹配的括号
	for ( int i = 0; i < strlen (str); i++ )
	{
		if ( str[i] != currentNeed ) 如果当前括号与急需匹配的括号不匹配,就把当前括号压栈,并改变相应的急需括号
		{
			pStaxk->push (str[i]);
			switch ( str[i] )
			{
			case'[':
					if ( currentNeed != 0 )
					{
						pneedStaxk->push (currentNeed);//<span style="font-family: Arial, Helvetica, sans-serif;">改变相应的急需括号之前要把一开始的急需括号压入需匹配括号栈中</span>

					}
					currentNeed = ']';
						break;
			case'(':
						if ( currentNeed != 0 )
						{
							pneedStaxk->push (currentNeed);
						}
						currentNeed = ')';
							break;
			default:
				cout << "字符串括号不匹配" << endl; //不是上述情况、比如出现’]’则直接判断出是不匹配的
				
				system ("pause");
				return 0;
			}
		}
		else   // 如果正好与需匹配的括号匹配了,那么进行出栈
		{
			char elem;
			pStaxk->pop (elem);
			if ( !(pneedStaxk->pop (currentNeed) ))//出栈不成功,即里面没有值
			{
				currentNeed = 0;
			}
		}
	}
	if ( pStaxk->stackEmpty () ) //依次出栈成功了,栈为空,匹配成功
	{
		cout << "字符串括号匹配" << endl;
	}
	else
	{
		cout << "字符串括号不匹配" << endl;
	}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

数据结构探险——栈篇

以下内容源于慕课网的学习整理,如有侵权,请告知删除。
  • oqqHuTu12345678
  • oqqHuTu12345678
  • 2017-06-20 17:43
  • 110

数据结构探险——线性表篇

以下内容源于慕课网的学习整理,如有侵权,请告知删除。 1、线性表 概念 机制的实现 2、顺序表 构造函数、析构函数 清空线性表,判空 求当前线性表长...
  • oqqHuTu12345678
  • oqqHuTu12345678
  • 2017-06-20 17:44
  • 139

数据结构探险——树篇

以下内容源于慕课网的学习整理,如有侵权,请告知删除。 树存在概念中,是对数组或者链表的一种操作方式的概念。 一、与树有关的一些基础概念 (1)树 有限节点的集合; (2)度 某个节点...
  • oqqHuTu12345678
  • oqqHuTu12345678
  • 2017-06-20 18:53
  • 113

数据结构探险——图篇

以下内容源于慕课网的学习整理,如有侵权,请告知删除。 1、图的相关概念         2、图的存储结构 第一种...
  • oqqHuTu12345678
  • oqqHuTu12345678
  • 2017-06-21 11:41
  • 124

数据结构学习之路-第三章:栈的应用

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】 前言: 前面已经介绍过栈的相关操作的具体实现,那么现在就按...
  • libin1105
  • libin1105
  • 2015-09-08 19:15
  • 1259

数据结构(5)--栈的定义以及相关操作的实现

 参考书籍:数据结构(C语言版) 严蔚敏 吴伟民编著 清华大学出版社 1.栈的定义     栈(stack)是限定在表尾一端进行插入或删除操作的线性表。在栈中,允许插入和删除操作的一端称为栈...
  • u010366748
  • u010366748
  • 2016-02-05 22:26
  • 1582

【数据结构】顺序栈的实现(c++)

头文件: #pragma once #include #include using namespace std; template class SeqStack { public:...
  • zhaoyaqian552
  • zhaoyaqian552
  • 2015-05-28 20:50
  • 661

数据结构-栈和队列小结

1栈   1>栈的定义:       栈是限定仅在表尾进行插入和删除操作的线性表。       我们把插入和删除的一端称为栈顶(TOP),另一端称为栈底(BOTTOM),不包含任何元素的栈称为空...
  • XiangTianZaiJie500
  • XiangTianZaiJie500
  • 2016-10-24 17:22
  • 1226

数据结构-栈-链栈完整可执行代码

数据结构-栈-链栈完整可执行代码 #include "stdio.h" #include "stdlib.h" #define OK 1 #define ERROR 0 #define TRUE ...
  • hitwhylz
  • hitwhylz
  • 2013-10-29 23:30
  • 2160

堆和栈的区别(内存和数据结构)

首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。 堆和栈都是一种数据项按序排列的数据结构。
  • chensi16114
  • chensi16114
  • 2016-07-26 11:42
  • 810
    个人资料
    • 访问:18170次
    • 积分:404
    • 等级:
    • 排名:千里之外
    • 原创:20篇
    • 转载:2篇
    • 译文:1篇
    • 评论:15条
    文章分类
    最新评论