堆栈
递归函数:直接或间接调用自己的函数就叫递归函数
递归与迭代的区别:
递归使用的是选择结构
迭代使用的是循环结构
栈的应用
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(); } };

浙公网安备 33010602011771号