栈和队列

来源:互联网 发布:2016gdp 知乎 编辑:程序博客网 时间:2024/06/05 23:43

队列都是操作受限制的线性表,栈只能在一端运算,队列只能在两端运算。

基本概念

  • (stack), 后进先出(LIFO),只在一端运算。
  • 栈顶(top)
  • 压栈(push)
  • 推出(pop)
  • LIFO性质(Last-In-First-Out)

抽象数据类型

//栈的抽象数据类型template<class T>class Stack{public:    void clear();    void push(const T & elem);    void pop();    T top();    bool isEmpty();    bool isFull();};

实现方式

  • 顺序方法,用向量(顺序表)实现
  • 可能出现上溢出(overflow )和下溢出(underflow )
//顺序栈template <class T>class arrStack:public class Stack{private:    int mSize;    int top;    T* st;public:    arrStack(int size){        mSize = size;        T* = new T[mSize];        top = -1;   //空栈的栈顶为指标-1    }    arrStack(){        top = -1;    }    ~arrStack(){        delete [] st;    }    void clear(){        top = -1;    }};//压栈template<class T>bool arrStack<T>::push(const T value){    if(top >= mSize - 1){        cout << "Stack Overflow!" << endl;        return false;    }    top++;    st[top] = value;    return true;}//取出栈顶元素template<class T>T arrStack<T>::top(){    return st[top];}//弹出栈顶bool arrStack<T>::top(){    if(top < 0){        cout << "Stack Underflow!" << endl;        return false;    }    top --;    return true;}
  • 链式方法,用单链表实现,指针自顶向下链接。
//链式栈template <class T>class linkStack{private:    T* top;    int size;public:    linkStack(){        top = NULL;        size = 0;    }    ~arrStack(){        clear();    }    void clear();};//压栈template<class T>bool linkStack<T>::push(const T value){    T* node = new T(value)    top++;    st[top] = value;    return true;}//出栈template<class T>T arrStack<T>::pop(){    if(top < 0){        cout << "Stack Underflow!" << endl;        return false;    }    T temp = st[top];    top --;    return temp;}
  • 时间效率,所有操作都只需要常数时间,两者相近。
  • 空间效率,顺序栈需要设置一个固定长度;链式表长度可变,但是增加结构性开支。

应用

计算表达式的值

中缀表达式变成后缀表达式

  • 从左到右每次读取一个字符
  • 数字直接输出
  • 左括号入栈
  • 右括号
    • 栈为空,error
    • 把栈顶元素依次pop,直到遇到左括号
    • 没有可以匹配的左括号,error
  • 四则运算符号
    • while(栈顶运算符的优先级不低于输入的运算符),弹出栈顶
    • 输入的运算符入栈
  • 读取完毕,依次弹出栈中剩余元素。遇左括号error。

后缀表达式求值

  • 从左到右依次读取字符
  • 操作数,压栈
  • 运算符,两次取出栈顶,计算,结果压栈

递归(Hanoi塔问题)

函数调用

队列

基本概念

  • 队列(queue), 先进先出(FIFO),在两端运算。
  • 名词
  • 栈顶(top)
  • 压栈(push)
  • 推出(pop)

实现方式

顺序方法,用向量实现
链式方法,用单链表实现

应用

调度或缓冲(邮件缓冲器)

宽度优先搜索

0 0
原创粉丝点击