当前位置: 编程技术>综合
本页文章导读:
▪基于顺序存储结构的栈 栈也是一种线性结构,如果用一句话介绍栈的话,那就是后进先出(LIFO:Last In First Out)。栈的特性是由于其特殊的存取方式决定的,那就是只能在一端进行存取动作。可以存取的一端一般称.........
▪boost asio程序优雅的退出 二 前一篇非常简单,容易懂。不过用在C++中还是需要封装成可以多个项目中使用的代码。下面将全局变量取消,创建了一个Server类,提供了run函数,同时Server对象还监听信号量,从而优雅的退出.........
▪网络传输的一些相关知识 昨天逛YouTube看了几个视频,是用flash的形式介绍网络传输的一些支持,个人觉得这样比较好理解抽象的概念。今天把它们上传到youku,贴出来给大家学习一下。鉴于CSDN不支.........
[1]基于顺序存储结构的栈
来源: 互联网 发布时间: 2013-11-10
栈也是一种线性结构,如果用一句话介绍栈的话,那就是后进先出(LIFO:Last In First Out)。栈的特性是由于其特殊的存取方式决定的,那就是只能在一端进行存取动作。可以存取的一端一般称为栈顶,另一端称为栈底。究竟栈底索引置为-1还是置为0也是一个讲究,普遍的方法是置为-1,这一点在后面的存取操作中会发现优势。 一般有push和pop操作,以及栈空,栈满等判断。
本文介绍的是基于顺序存储结构的实现,那就是用到了数组,为了更灵活采取的是动态开辟内存空间的形式。栈结构中还有一个top这个俗称栈指针的东西很重要。其实就是一个整型下标索引值。
//在进栈和出栈时 先判断条件是否成立 重中之重 #pragma once #include<iostream> using namespace std; template<class T> class Stack { public: int MAXSIZE;//栈最大体积 T *arr;//动态空间 int top;//类似于指向当前元素的栈指针 public: Stack(const int stacksize = 100);//构造函数 Stack(const Stack<T>& S);//深复制 ~Stack();//析构函数 void DestroyStack();//销毁栈 void output();//输出栈元素 一次性全部输出栈元素 T pop();//出栈 void push(T pushelem);//进栈 bool isEmpty();//判栈满 bool isFull();//判栈空 int GetSize();//返回栈元素数 int Gettop(); }; template<class T> int Stack<T>::Gettop() { return top; } template<class T> Stack<T>::Stack(const int stacksize) { if(stacksize < 0)//初始化参数 判断 { cout<<"非法值"<<endl; exit(1); } MAXSIZE = stacksize; arr = new T[MAXSIZE]; top = -1 ;//指针 初始化为-1,此时无元素 } //深复制函数 template<class T> Stack<T>::Stack(const Stack<T>& S) { MAXSIZE = S.MAXSIZE; arr = new T[MAXSIZE]; if(arr == NULL) { cout<<"内存分配错误"<<endl; exit(1); } int current = S.top ;//不用top指针操作,防止篡改了top值 while(current != -1)//复制 直到栈指针指向栈底后一位,跳出循环 { arr[current] = S.arr[current] ; current-- ; } top = S.top ;//把top值赋给当前栈 } template<class T> Stack<T>::~Stack() { delete []arr ;//连续空间的删除 } template<class T> void Stack<T>::DestroyStack() { delete []arr ;//类似于析构函数的作用,在过程中使用 } //返回栈最大体积 template<class T> int Stack<T>::GetSize() { return MAXSIZE ; } //判栈满 template<class T> bool Stack<T>::isFull() { return ((top == MAXSIZE-1) ? true : false); } //判栈空 template<class T> bool Stack<T>::isEmpty() { return (( top == -1) ? true : false); } //输入 /*template<class T> void Stack<T>::input() { }*/ //输出 template<class T> void Stack<T>::output() { int current = top;//只能从栈顶以此输出 while(current != -1) { cout<<arr[current]<<endl; current--; } } //压栈 template<class T> void Stack<T>::push(T pushelem) { if(top == MAXSIZE-1)//栈满,无法压栈操作 { cout<<"Stack is full!"<<endl; return ; } arr[++top] = pushelem ; } //出栈 template<class T> T Stack<T>::pop() { if(top == -1)//空栈,无法执行出栈操作 { cout<<"Stack is empty!"<<endl; exit(1); } return arr[top--];//只在栈顶的操作,方便快捷,修改top值即可 }
作者:ZLhy_ 发表于2013-1-13 13:09:56 原文链接
阅读:46 评论:0 查看评论
[2]boost asio程序优雅的退出 二
来源: 互联网 发布时间: 2013-11-10
前一篇非常简单,容易懂。不过用在C++中还是需要封装成可以多个项目中使用的代码。
下面将全局变量取消,创建了一个Server类,提供了run函数,同时Server对象还监听信号量,从而优雅的退出。
#include <cstdlib> #include <boost/asio.hpp> #include <boost/bind.hpp> #include <iostream> using namespace boost; using namespace boost::asio; using namespace std; class Server { public: Server(io_service & s) : io_(s), signals_(s) { signals_.add(SIGINT); signals_.add(SIGTERM); #if defined(SIGQUIT) signals_.add(SIGQUIT); #endif signals_.async_wait(boost::bind(&Server::stop, this)); } void run() { io_.run(); } private: void stop() { cout << "x" << endl; io_.stop(); } private: io_service& io_; boost::asio::signal_set signals_; }; int main(int argc, char** argv) { io_service s; Server server(s); s.run(); return 0; }
运行程序,然后用kill 命令杀掉进程。结果是显示了x后,程序退出。
作者:sheismylife 发表于2013-1-13 13:57:04 原文链接
阅读:46 评论:0 查看评论
[3]网络传输的一些相关知识
来源: 互联网 发布时间: 2013-11-10
昨天逛YouTube看了几个视频,是用flash的形式介绍网络传输的一些支持,个人觉得这样比较好理解抽象的概念。今天把它们上传到youku,贴出来给大家学习一下。鉴于CSDN不支持嵌入视频,就给出网址吧
一、网络勇士http://v.youku.com/v_show/id_XNTAxMjk4OTk2.html
二、DNS是如何工作的http://v.youku.com/v_show/id_XNTAxMzA2Njcy.html
作者:DecKen_H 发表于2013-1-13 13:41:33 原文链接
阅读:59 评论:0 查看评论
最新技术文章: