用数组和链表分别实现栈类stack,队queue

来源:互联网 发布:图论算法 python 编辑:程序博客网 时间:2024/05/17 02:49

栈(stack)是一种常见数据结构,以后进先出(LIFO)著称。比如编译器用栈处理函数调用,保存被调用函数的参数和局部变量。当一个函数调用另一个函数时候,新的函数参数和局部变量被入栈。调用结束,占用的资源从栈释放。

用数组实现:

class vector{private:  T *ele;int size;int cap;public:vector<T>(){size=0;cap=16;ele=new T[cap];}void sure(){if(size>cap) {T*old=ele;cap=2*size;ele=new T[cap];for(int i=0;i<size;i++)  ele[i]=old[i];delete old;}}void push_back(T x);void pop_back();int size1();T at(int index);  bool empty();void clear();void swap(vector<T> &v1);};template<typename T>void vector<T>::push_back(T x){sure();ele[size++]=x;}template<typename T>void vector<T>::pop_back(){if(empty()) throw runtime_error("empty");--size;}template<typename T>int vector<T>::size1(){return size;}template<typename T>T vector<T>::at(int index){if(empty()||index>cap) throw runtime_error("empty");return ele[index];}template<typename T>bool vector<T>::empty(){if(size==0) return true;else return false;}template<typename T>void vector<T>::clear(){while(!empty()){pop_back();}}template<typename T>void vector<T>::swap(vector<T> &v1){int len=v1.size1();if(len>=size){T *p=new T[len];for(int i=0;i<size;i++){p[i]=ele[i];}clear();for(int i=0;i<len;i++)push_back(v1.at(i));v1.clear();for(int i=0;i<len;i++){v1.push_back(p[i]);}}else{T *p=new T[size];for(int i=0;i<size;i++){p[i]=ele[i];}clear();for(int i=0;i<len;i++){ele[i]=v1.at(i);}v1.clear();for(int i=0;i<size;i++){v1.push_back(p[i]);}}}
用栈实现:

#include"15.h"//包含linklist类定义using namespace std;template<typename T>class stack1{private:   linklist<T> li;public:stack1();bool isempty();T peek();void push(T val);T pop();int getsize1();};//definetemplate<typename T>stack1::stack1(){}template<typename T>bool stack1<T>::isempty(){return li.empty();}template<typename T>T satck1<T>::peek(){if(isempty()) throw runtime_error("empty");return li.getlast();}template<typename T>void stack1<T>::push(T val){li.addlast(val);}template<typename T>T stack1<T>::pop(){return li.removelast();}template<typename T>int stack1<T>::getsize1(){return li.getsize();}
可以发现,定义好链表类Linklist后,实现其他的数据结构比如:stack类非常简单,常见的就是根据stack类LIFO准则在链表尾部各种操作即可。stack类的接口(各种成员函数和构造函数不变),只是具体实现是链表而不是数组。这也侧面体现了封装的好处,使用者只需考虑接口如何使用,内部任便何种实现!

由此可以得到启发,用链表实现队的实现,与stack的LIFO不同,queue是FIFO机制,根据此类机制实现:

template<typename T>class queue{private:  linklist<T> list;public:queue(){}    void enqueue(T val);    T dequeue();int getsize();};template<typename T>void queue<T>::enqueue(T val){list.addlast(val);}template<typename T>T queue<T>::dequeue(){return list.removefirst();}template<typename T>int queue<T>::getsize(){return list.getsize();}


0 0
原创粉丝点击