`
hao3100590
  • 浏览: 131452 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

栈的各种实现

阅读更多

1.算法描述

a.实现二个栈,在一个数组里面,除非没有任何空间剩余,否则不能有溢出声明

b.实现一个没有头尾结点的栈(单链表)

c.实现带有头结点的栈(单链表)

 

2.双栈

对于双栈,我们还可以添加resize()方法,当空间满了重新自动分配空间(new),就是将原来的两个栈,拷贝到新建立的数组上面去

a.dsexceptions.h

 

#ifndef DSEXCEPTIONS_H
#define DSEXCEPTIONS_H
//栈溢出异常
class StackOverFlowException{ //public: exception
	 public:
		 const char* what() const throw()  
	   {  
	      return  "stack over flow exception, the size<=0 !\n";
	   }  
};
//数组越界异常
class ArrayOverFlowException{
	public:
		 const char* what() const throw()  
	   {  
	      return  "array over flow exception, the size over array length !\n";
	   }  
};
//栈索引异常(栈序号只能是1,2)
class ErrorIndexException{
	public:
		 const char* what() const throw()  
	   {  
	      return  "the stack index only be 1 and 2 !\n";
	   }  
};

#endif

 b.stack2.h

 

/**
	*实现二个栈,在一个数组里面,除非没有任何空间剩余,否则不能有溢出声明
	**/
#ifndef STACK2_H
#define STACK2_H
#include <iostream>
#include "dsexceptions.h"

enum{
		LEFT = 1,		//左栈
		RIGHT	= 2	//右栈
};

template<class T>
class stack2{
	public:
		stack2(int len){
			array = new T[len];
			leftTop = -1;
			rightTop = len; 
			max = len;
		}
		
		~stack2(){
			delete [] array;
		}
		
		//出栈,flag为栈编号(1为栈1,2为栈2)
		T pop(int flag){
			if(flag == LEFT){
					if(leftTop == -1)
						throw	StackOverFlowException();
					return array[leftTop--];
			}else if(flag == RIGHT){
					if(rightTop == max)
						throw	StackOverFlowException();
					return array[rightTop++];
			}else{
				throw ErrorIndexException();
			}
		}
		
		void push(int flag, T x){
			if(leftTop == rightTop)
				throw ArrayOverFlowException();
			if(flag == LEFT){
					array[++leftTop] = x;
			}else if(flag == RIGHT){
					array[--rightTop] = x;
			}else{
				throw ErrorIndexException();
			}
		}
		
		T top(int flag) const{
			if(flag == LEFT){
					if(leftTop == -1)
						throw	StackOverFlowException();
					return array[leftTop];
			}else if(flag == RIGHT){
					if(rightTop == max)
						throw	StackOverFlowException();
					return array[rightTop];
			}else{
				throw ErrorIndexException();
			}
		}
		
		bool empty(int flag) const{
			if(flag == LEFT){
					if(leftTop == -1)
						return true;
			}else if(flag == RIGHT){
					if(rightTop == max)
						return true;
			}else{
				throw ErrorIndexException();
			}
			return false;
		}
		
		void printStack(int flag) const{
			if(flag == LEFT){
					std::cout<<"[";
					for(int i=leftTop; i>-1; i--){
						std::cout<<array[i]<<" ";
					}
					std::cout<<"]"<<std::endl;
			}else if(flag == RIGHT){
					std::cout<<"[";
					for(int i=rightTop; i<max; i++){
						std::cout<<array[i]<<" ";
					}
					std::cout<<"]"<<std::endl;
			}else{
				throw ErrorIndexException();
			}
		}
		
		
		int size(int flag) const{
			if(flag == LEFT){
					return leftTop+1;
			}else if(flag == RIGHT){
					return max-rightTop;
			}else{
				throw ErrorIndexException();
			}
		}
	private:
		int leftTop;			//左边数组栈顶
		int rightTop;			//右边数组栈顶
		int max;					//数组长度
		T* array;					//数组
};

#endif

 c.main.cpp

 

#include <iostream>
#include "stack2.h"
using namespace std;

int main(){
	try{
		stack2<int> s(10);
		for(int i=0; i<4; i++){
			s.push(1, i);
			s.push(2, i);
		}

		cout<<"stack1:"<<endl;
		s.printStack(1);
		cout<<s.top(1)<<endl;
		cout<<s.pop(1)<<endl;
		cout<<s.size(1)<<endl;
		cout<<s.empty(1)<<endl;
		s.push(1, 9);
		s.push(1, 9);
		s.push(1, 9);
		cout<<s.size(1)<<endl;
		s.printStack(1);
		

		cout<<"stack2:"<<endl;
		s.printStack(2);
		cout<<s.top(2)<<endl;
		for(int i=0; i<4; i++)
			s.pop(2);
		cout<<s.size(2)<<endl;
		cout<<s.empty(2)<<endl;
		s.printStack(2);

	}catch(StackOverFlowException &e){
		cout<<e.what();
	}catch(ArrayOverFlowException &e){
		cout<<e.what();
	}catch(ErrorIndexException &e){
		cout<<e.what();
	}
	return 0;
}
 

 

 

3.单链表实现没有头尾结点的栈

stack.h

 

#ifndef STACK_H
#define STACK_H
#include <iostream>
#include "dsexceptions.h"

template<class T>
struct Node{
	Node<T>* next;
	T data;
};

template<class T>
class stack{
	public:
		stack(){
			first = new Node<T>;
			first->next = NULL;
			length = 0;							
		}
		
		stack(T a[], int n){
			first = new Node<T>;
			first->next = NULL;
			length = n;
			first->data = a[0];
			for(int i=1; i<n; i++){
				Node<T> *t = new Node<T>;
				t->data = a[i];
				t->next = first;
				first = t;
			}
		}
		
		~stack(){
			freeStack();
		}
		
		T pop(){
			T data;
			if(length != 0){
				Node<T> *r = first;
				data = r->data;
				if(length == 1)		//当只剩下一个节点的时候不删除,保留方便下次push
					first->data = 0;
				else{
					first = first->next;
					delete r;
				}	
				length--;
			}else{
				throw StackOverFlowException();
			}
			return data;
		}
		
		void push(T x){
			if(length == 0) first->data = x;
			else{
				Node<T> *r = new Node<T>;
				r->data = x;
				r->next = first;
				first = r;
			}
			length++;
		}
		
		T top() const{
			if(length == 0)
				throw StackOverFlowException();
			return first->data;
		}
		
		bool empty() const{
			if(length == 0) return true;
			return false;
		}
		
		int size() const{
			return length;
		}
		
		void printStack() const{
			std::cout<<"[";
			Node<T> *r = first;
			while(r){
				if(length == 0) break;			//当没有元素的时候,first并没删除!故而会输出data
				std::cout<<r->data<<" ";
				r = r->next;
			}
			std::cout<<"]"<<std::endl;
		}
		
	private:
		Node<T>* first;//栈顶(指向栈顶)
		int length;
		void freeStack(){
			Node<T> *r = first, *t;
			while(r){
				t = r;
				r = r->next;
				delete t;
			}
		}
};

#endif

 

main.cpp

 

#include <iostream>
#include "stack.h"
using namespace std;

int main(){
	stack<int> k;
	k.push(2);
	cout<<k.size()<<endl;
	k.pop();
	k.printStack();
	
	int a[] = {1,2,3,4,5,6};
	stack<int> s(a, 6);
	s.printStack();
	s.push(7);
	s.printStack();
	cout<<"size:"<<s.size()<<endl;
	s.pop();
	s.printStack();
	try{
		for(int i=0; i<6; i++){
			s.pop();
		}
		s.push(7);
		s.push(8);
		s.printStack();
		cout<<"size:"<<s.size()<<endl;
		s.pop();
		s.pop();
		s.pop();
		s.printStack();
	}catch(StackOverFlowException &e){
		cout<<e.what();
	}
	
	return 0;
}
 

4.带有头结点的栈

stack.h

 

#ifndef STACK_H
#define STACK_H
#include <iostream>
#include "dsexceptions.h"

template<class T>
struct Node{
	Node<T>* next;
	T data;
};

template<class T>
class stack{
	public:
		stack(){
			first = new Node<T>;
			first->next = NULL;
			end = first;
			length = 0;
		}
		
		stack(T a[], int n){
			first = new Node<T>;
			length = n;
			Node<T> *r = first;
			for(int i=0; i<n; i++){
				Node<T> *t = new Node<T>;
				t->data = a[i];
				t->next = r;
				r = t;
			}
			end = r;
		}
		
		~stack(){
			freeStack();
		}
		
		T pop(){
			T data;
			if(length != 0){
				Node<T>* r = end;
				end = end->next;
				data = r->data;
				delete r;
				length--;
			}else{
				throw StackOverFlowException();
			}
			return data;
		}
		
		void push(T x){
			Node<T> *r = new Node<T>;
			r->data = x;
			r->next = end;
			end = r;
			length++;
		}
		
		T top() const{
			if(length == 0)
				throw StackOverFlowException();
			return end->data;
		}
		
		bool empty() const{
			if(length == 0) return true;
			return false;
		}
		
		int size() const{
			return length;
		}
		
		void printStack() const{
			std::cout<<"[";
			Node<T> *r = end;
			while(r != first){
				std::cout<<r->data<<" ";
				r = r->next;
			}
			std::cout<<"]"<<std::endl;
		}
		
	private:
		Node<T>* first;//栈底(不存储元素)
		Node<T>* end;//栈顶(指向栈顶)
		int length;
		void freeStack(){
			Node<T> *r = end, *t;
			while(r != first){
				t = r;
				r = r->next;
				delete t;
			}
			delete r;
		}
};

#endif

 

 

 

 

 

 

分享到:
评论

相关推荐

    java 栈的实现和应用

    在Java中,栈可以用于实现各种算法和功能,如表达式求值、递归调用、内存管理等。 在Java中,有两种主要的方式来实现栈: 1. **ArrayDeque类**:Java集合框架提供了一个双端队列`ArrayDeque`,它可以被用作一个...

    算法栈的应用栈的实现

    在计算机科学中,栈被广泛应用于各种算法和问题解决中。栈的主要操作包括入栈(Push)、出栈(Pop)、查看栈顶元素(Peek)和检查栈是否为空(IsEmpty)。 标题中的“算法栈的应用栈的实现”,主要涉及了三个方面:...

    用栈实现计算器

    在本文件中,通过使用C++编程语言,实现了一个基于栈的计算器。该计算器采用两个栈,一个用于存储数字,另一个用于存储运算符。具体的实现细节如下: 知识点1:栈(Stack)的基本概念 栈是一种先进后出(FILO, ...

    链式栈和顺序栈的实现

    栈广泛应用于各种算法和程序设计中,如递归、表达式求值、函数调用等。本话题将详细探讨链式栈和顺序栈的实现。 1. **栈的基本操作** - **压栈(Push)**:向栈顶添加元素。 - **弹栈(Pop)**:移除并返回栈顶...

    顺序栈各种基本运算算法的实现

    栈中数据用数组储存,通过top(),push(),pop()基本的函数用以实现其功能。 参见博客:http://blog.csdn.net/xiaowei_cqu/article/details/7748152

    数据结构之栈的实现.rar

    在计算机科学中,栈常用于解决各种问题,如括号匹配、深度优先搜索(DFS)、回溯算法等。严蔚敏教授的《数据结构》是一本经典的教材,本项目在此基础上进行了适当的修改,以适应实际编程需求。 栈的实现可以有多种...

    数据结构栈的实现

    通过本实验的学习,学生不仅能够掌握栈的基本理论知识,还能通过实践加深对栈的各种实现方式的理解。链式存储栈和顺序存储栈各有优势,前者在内存利用方面更为灵活,后者则在访问速度上更胜一筹。实验报告中应详细...

    C语言 栈的实现,包含顺序栈和链栈,亲测可用

    本文将详细讨论在C语言中如何实现栈,包括顺序栈和链栈,并基于提供的文件名来解析它们的实现。 1. **顺序栈**:顺序栈是通过数组来实现的,其优点在于存储空间连续,访问速度快。`stack_array.c`和`stack_array.h`...

    顺序栈实现

    C++ 是一种通用的编程语言,以其强大的模板系统而闻名,使得在C++中实现各种数据结构变得非常灵活。在这个场景中,我们将探讨如何使用C++模板来创建一个顺序栈。 首先,我们需要定义一个顺序栈类,它通常包含两个...

    顺序栈实现括号配对

    使用顺序栈可以实现括号配对的判断逻辑,该方法可以应用于各种括号配对的场景中。在实际应用中,我们可以根据具体情况选择合适的数据结构和算法来解决问题。 知识点: 1. 顺序栈的定义和实现 2. 栈的操作接口...

    数据结构栈实现进制的转换

    数据结构中,栈是一种重要的数据结构,它可以用来实现各种数据的转换。在这个例子中,我们将使用栈来实现十进制到十六进制的数据转换。 首先,让我们来了解一下栈的基本概念。栈是一种后进先出的数据结构,它可以...

    链栈和顺序栈的实现

    本文将深入探讨两种常见的栈实现方式:链栈和顺序栈,并通过提供的源码文件来理解它们的实现细节。 1. **链栈**: 链栈是基于链表实现的栈,其元素存储在一系列分散的内存位置中,每个元素(节点)包含一个数据...

    栈关于数组与链表的实现

    在计算机科学中,栈常用于各种算法和程序设计中,如表达式求值、递归、深度优先搜索等。栈的两种常见实现方式是数组和链表,各有优缺点。 数组实现的栈: 1. **优点**:数组实现的栈空间连续,访问效率高,因为内存...

    栈原理实现计算器

    栈广泛应用于各种算法和程序设计中,如递归、深度优先搜索、编译器中的语法分析等。本篇将详细介绍如何利用栈的这一特性来实现一个简单的计算器。 首先,我们需要理解栈的基本操作:压栈(push)和弹栈(pop)。...

    利用栈实现逆置单链表

    ### 利用栈实现逆置单链表 在计算机科学中,数据结构是研究的核心之一。其中,链表和栈是非常基础且重要的两种数据结构。本文将详细介绍如何使用栈来实现单链表的逆置。 #### 一、基础知识回顾 在深入探讨之前,...

    数据结构课程:顺序栈和链栈的实现

    ### 数据结构课程:顺序栈和链栈的实现 #### 栈的基本概念 栈是一种特殊的线性表,其特殊之处在于所有元素的插入和删除都只能在一端进行,这一端被称为栈顶(top),与之相对的一端称为栈底(bottom)。栈通常支持以下...

    数据结构 栈的实现(c语言版)

    在本主题中,我们将深入探讨数据结构中的一个重要组成部分——栈,并以C语言为实现平台。栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO)的原则,即最后进入的元素最先被移出。 栈的基本操作通常包括: 1. ...

    数据结构 栈 链表实现 c++ 模板

    在这个文件中,可以看到`Stack`类的实例化和各种操作,如初始化栈、压栈、弹栈等,以确保栈的正确功能。这通常是通过主函数(`main()`)来完成的,通过一系列测试用例来验证栈的操作。 在链表实现的栈中,每个节点...

    Linux协议栈实现分析

    在计算机网络中,协议栈是操作系统的核心组成部分,负责处理网络通信的各种协议。对于Linux系统而言,其内核中的TCP/IP协议栈是实现网络通信的基础,它负责解析、处理并转发网络数据。本文将深入探讨Linux协议栈实现...

    利用栈实现计算器

    在实际编程中,我们可以使用各种编程语言提供的内置数据结构来实现栈。例如,在Python中,可以使用list作为栈,用append()模拟压栈,用pop()模拟弹栈。对于更复杂的情况,如处理括号或优先级,我们可能需要扩展此...

Global site tag (gtag.js) - Google Analytics