- 浏览: 131452 次
- 性别:
- 来自: 成都
最新评论
-
yi_chao_jiang:
你好,多谢分享,问个问题,在上传数据的时候判断文件是否有上传记 ...
断点续传和下载原理分析 -
a41606709:
为什么我的tabhost显示不出来? 怎么设置在全部页面中让他 ...
TabActivity中的Tab标签详细设置 -
Zero颴:
大神篇,思路,配图都很清晰,perfect!
Android事件模型之interceptTouchEvnet ,onTouchEvent关系正解 -
QAZ503602501:
牛死人了!!!
B-树 -
mengsina:
很牛的文档。数学功底好啊
Android Matrix理论与应用详解
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
发表评论
-
排序方法总结
2012-08-12 11:34 1176这里面包含了所有常见的排序操作 1.性能等比较分析 2 ... -
常见字符串操作大全
2012-08-12 11:34 14591.常见的字符串操作 如计算长度,求子串等都是考验基本功的, ... -
KMP算法解析
2012-08-12 11:35 2834一.理论基础 1.什么 ... -
二叉堆的实现
2012-08-12 11:35 12101.堆的概念 这里只需要注意两点: a.堆的存储方式:就是 ... -
set和map的简单实现
2012-08-10 11:35 13141.Set的简单实现 set是利用二叉查找树来实现的,而且为 ... -
红黑树的插入总结
2012-08-10 11:25 14051.红黑树 这个在july的博客中有详尽的说明,我就不在赘述 ... -
B-树实现
2012-08-10 11:03 16241.什么是B-树? 这个在我的前一篇博客中已经详细的阐释过: ... -
平衡二叉树
2012-08-10 10:39 28481.问题描述 什么是平衡 ... -
二叉排序树
2012-08-10 10:25 14751.基本概念 二叉排 ... -
B-树
2012-07-04 22:48 56661.B-树的概念 是一种多 ... -
构造哈夫曼树
2012-07-04 10:40 12291.算法说明 就是建造哈夫曼树树,从而使得构造出的树带权路径 ... -
线索二叉树
2012-07-04 09:20 12721.算法描述 就是简单的线索二叉树的建立,遍历,查找等基本操 ... -
二叉树基本操作大全
2012-07-03 18:22 26021.二叉树的基本操作 这里我有一个疑问: 在使用构造 ... -
多种队列的实现
2012-06-29 10:09 15501.算法描述 a.数据结构与算法(Mark Allen We ... -
中缀表达式转换为后缀
2012-06-28 11:10 18251.算法描述 例如a+b*c这是常见的中缀表达式,但是 ... -
后缀表达式的值
2012-06-27 16:33 13321.算法描述 计算后缀表达式的值 2.事例 如:( ... -
Josephus问题
2012-06-21 15:30 9961.算法描述 简单的游戏:有N个人坐成一圈,编号1-N、从编 ... -
关于最长递增子序列的实际应用--动态规划
2012-06-07 11:35 1829参考链接: a.http://www.programfan. ... -
线性查找二维数组
2012-06-05 17:23 10301.算法描述 有序(行有序,列有序,且每行从左至右递增 ... -
整数的随机置换
2012-06-05 15:10 2318算法描述:生成前N个整 ...
相关推荐
在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
在计算机科学中,栈常用于解决各种问题,如括号匹配、深度优先搜索(DFS)、回溯算法等。严蔚敏教授的《数据结构》是一本经典的教材,本项目在此基础上进行了适当的修改,以适应实际编程需求。 栈的实现可以有多种...
通过本实验的学习,学生不仅能够掌握栈的基本理论知识,还能通过实践加深对栈的各种实现方式的理解。链式存储栈和顺序存储栈各有优势,前者在内存利用方面更为灵活,后者则在访问速度上更胜一筹。实验报告中应详细...
本文将详细讨论在C语言中如何实现栈,包括顺序栈和链栈,并基于提供的文件名来解析它们的实现。 1. **顺序栈**:顺序栈是通过数组来实现的,其优点在于存储空间连续,访问速度快。`stack_array.c`和`stack_array.h`...
C++ 是一种通用的编程语言,以其强大的模板系统而闻名,使得在C++中实现各种数据结构变得非常灵活。在这个场景中,我们将探讨如何使用C++模板来创建一个顺序栈。 首先,我们需要定义一个顺序栈类,它通常包含两个...
使用顺序栈可以实现括号配对的判断逻辑,该方法可以应用于各种括号配对的场景中。在实际应用中,我们可以根据具体情况选择合适的数据结构和算法来解决问题。 知识点: 1. 顺序栈的定义和实现 2. 栈的操作接口...
数据结构中,栈是一种重要的数据结构,它可以用来实现各种数据的转换。在这个例子中,我们将使用栈来实现十进制到十六进制的数据转换。 首先,让我们来了解一下栈的基本概念。栈是一种后进先出的数据结构,它可以...
本文将深入探讨两种常见的栈实现方式:链栈和顺序栈,并通过提供的源码文件来理解它们的实现细节。 1. **链栈**: 链栈是基于链表实现的栈,其元素存储在一系列分散的内存位置中,每个元素(节点)包含一个数据...
在计算机科学中,栈常用于各种算法和程序设计中,如表达式求值、递归、深度优先搜索等。栈的两种常见实现方式是数组和链表,各有优缺点。 数组实现的栈: 1. **优点**:数组实现的栈空间连续,访问效率高,因为内存...
栈广泛应用于各种算法和程序设计中,如递归、深度优先搜索、编译器中的语法分析等。本篇将详细介绍如何利用栈的这一特性来实现一个简单的计算器。 首先,我们需要理解栈的基本操作:压栈(push)和弹栈(pop)。...
### 利用栈实现逆置单链表 在计算机科学中,数据结构是研究的核心之一。其中,链表和栈是非常基础且重要的两种数据结构。本文将详细介绍如何使用栈来实现单链表的逆置。 #### 一、基础知识回顾 在深入探讨之前,...
### 数据结构课程:顺序栈和链栈的实现 #### 栈的基本概念 栈是一种特殊的线性表,其特殊之处在于所有元素的插入和删除都只能在一端进行,这一端被称为栈顶(top),与之相对的一端称为栈底(bottom)。栈通常支持以下...
在本主题中,我们将深入探讨数据结构中的一个重要组成部分——栈,并以C语言为实现平台。栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO)的原则,即最后进入的元素最先被移出。 栈的基本操作通常包括: 1. ...
在这个文件中,可以看到`Stack`类的实例化和各种操作,如初始化栈、压栈、弹栈等,以确保栈的正确功能。这通常是通过主函数(`main()`)来完成的,通过一系列测试用例来验证栈的操作。 在链表实现的栈中,每个节点...
在计算机网络中,协议栈是操作系统的核心组成部分,负责处理网络通信的各种协议。对于Linux系统而言,其内核中的TCP/IP协议栈是实现网络通信的基础,它负责解析、处理并转发网络数据。本文将深入探讨Linux协议栈实现...
在实际编程中,我们可以使用各种编程语言提供的内置数据结构来实现栈。例如,在Python中,可以使用list作为栈,用append()模拟压栈,用pop()模拟弹栈。对于更复杂的情况,如处理括号或优先级,我们可能需要扩展此...