堆栈

递归函数:直接或间接调用自己的函数就叫递归函数

递归与迭代的区别:

递归使用的是选择结构

迭代使用的是循环结构

栈的应用

1、将中缀表达式转化为后缀表达式

2、用后缀表达式计算:

从左到右遍历表达式,遇到数字就进栈,遇到符号就将栈顶的两个数字出栈,进行运算,

将结果返回栈中,直到最后获得结果

 

撤销、回退都是通过栈来实现的

 

栈不允许有遍历行为,但是可以求empty()和size()

队列也不允许有遍历行为

 

栈LIFO

常用接口:

  • push()
  • pop()
  • top()
  • size()
  • empty()

 

队列FIFO

常用接口:

  • front()
  • back()
  • pop()
  • push()
  • size()
  • empty()

 

题目:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false

class MyQueue {
public:

    stack<int> stin;
    stack<int> stout; 

    MyQueue() {

    }
    
    void push(int x) {
        stin.push(x);
    }
    
    int pop() {
        //前提stout为空
        if(stout.empty())
        {
            while(!stin.empty())//将stin中的数全部移入stout
            {
                stout.push(stin.top());
                stin.pop();
            }

        }
            int result=stout.top();//先移入stout中再在stin中移除
            stout.pop();
            return result;


    }
    
    int peek() {
        int result=this->pop();//直接利用pop()函数
        stout.push(result);//注意要在stout中
        return result;
    }
    
    bool empty() {
        if(stin.empty() && stout.empty())
        {
            return true;
        }

        return false;

    }
};

 题目:

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false

也可以只用一个队列实现,将需要移除前的元素重新加入到队尾

class MyStack {
public:

    queue<int> que1;
    queue<int> que2;//用来备份

    MyStack() {

    }
    
    void push(int x) {
        que1.push(x);

    }
    
    int pop() {
        int size=que1.size();
        size--;
        while(size--)//将除了最后一位的que1里的元素全部移入que2中
        {
            que2.push(que1.front());
            que1.pop();

        }

        int result=que1.front();
        que1.pop();
        que1=que2;///再将que2赋值给que1
        while(!que2.empty())//将que2清空
        {
            que2.pop();
        }

        return result;

    }
    
    int top() {
        return que1.back();//可以返回que1的尾部值但是无法删除

    }
    
    bool empty() {
        return que1.empty();

    }
};

 

posted @ 2023-05-07 21:50  该说不唠  阅读(53)  评论(0)    收藏  举报