栈在语言中模板类
栈的运用
栈在高级算法中是一种不可或缺的工具,单独使用可能不会太多次数。
小邋遢的衣橱
小邋遢 MS.Jinlin 是个爱打扮的公主,他有很多晚礼服如”LALA” “NIHAOMA”、”WOBUHAO”、”NIHAOBUHAO”等众多衣服,可是由于衣服太多他要把它们装进箱子,但是作为公主,肯定是会突发奇想觉得哪件衣服好看,就把他拿了出来,当然那件衣服上面的衣服也被拿出来了,而且会弄乱了,小邋遢在经过几次的叠衣服和取衣服后,他想知道箱子里最上面的衣服是哪一件,如果箱子为空的话,就告诉她 Empty ,如果有多件一样的衣服,肯定是取走最上面的那一件啦。
输入描述
第 11 行,输入N,代表共计进行了几次操作。
第 22 行至第 N+1 行,进行 in out 操作(in 为 放入衣服,out 为 取出衣服)
格式如下:
输出描述
输出 N 次操作结束后箱子最上面的衣服名字,若箱子为空,输出 Empty。
利用c++内置栈模板解题
C++内置栈模板
LIFO stack 堆栈,它是一种容器适配器,专门设计用于在 LIFO 上下文(后进先出)中操作,其中元素仅从容器的一端插入和提取。
stack 被实现为容器适配器 它们是使用特定容器类的封装对象作为其类底层容器的 ,提供一组特定的成员函数来访问其元素。元素推入 / 弹出 从 的 “后面” 特定容器 ,这被称为 的顶部堆栈。
底层容器可以是任何标准容器类模板或一些其他专门设计的容器类。
- C++ 的 stack 模板定义了如下操作:
top():
返回一个栈顶元素的引用,类型为 T&。如果栈为空,返回值未定义。
push(const T& obj):
可以将对象副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。
push(T&& obj):
以移动对象的方式将对象压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。
pop():
弹出栈顶元素。
size():
返回栈中元素的个数。
C++代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <iostream> #include <stack> using namespace std; stack<string> mystack;
int main(){ int N; cin>>N; while(N--){ string op,name; cin>>op>>name; if(op=="in"){ mystack.push(name); } else{ while(mystack.top()!=name){ mystack.pop(); } mystack.pop(); } } if(mystack.empty()){ cout<<"Empty"<<endl; } else{ cout<<mystack.top()<<endl; } return 0; }
|
利用java内置栈类解题
java内置栈类
栈是 Vector 的一个子类,它实现了一个标准的后进先出的栈,至于什么是 Vector,大家可以理解为能力超强的数组,在后面的课程中,我们会进行讲解。
堆栈定义了默认构造函数,用来创建一个空栈。
- Java 的 stack 模板定义了如下操作流程
push():
执行 push 时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。
peek():
执行 peek 时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。
pop():
执行 pop 时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。
empty():
继承于 Vector,返回是否为空
size():
继承 Vector,返回元素的个数。
Java代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import java.util.Scanner; import java.util.Stack;
public class Main{ static Stack Mystack=new Stack();
public static void main(String[] args){ int N; Scanner in=new Scanner(System.in); N=in.nextInt();
for(int i=0;i<N;i++){
String op,name; op=in.next(); name=in.next(); if(op.contains("in")){
Mystack.push(name); } else{ while(!Mystack.peek().equals(name)){ Mystack.pop(); } Mystack.pop(); } } if(Mystack.empty()){ System.out.println("Empty"); } else{ System.out.println(Mystack.peek()); } } }
|
Python的栈的实现
由于 Python 没有现成的栈的定义,要想使用,只能进行自己模拟,模拟方法可以使用上面使用的方法,也可以看一下下面讲的高级点的方法,声明并定义一个栈类的方法,推荐使用下面的方法,上面的代码还是主要讲理论使用。
Python代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
class MyStack: def __init__(self): self._data = []
def is_empty(self): return self._data == []
def push(self, elem): self._data.append(elem)
def pop(self): if self._data == []:
raise Warning ("此栈为空,错误操作");
return self._data.pop()
def top(self): if self._data == []: raise Warning("此栈为空,错误操作");
return self._data[-1]
if __name__=='__main__':
N=int (input())
Stack =MyStack()
while N>0: N-=1 op=input().split()
if(op[0]=='in'): Stack.push(op[1])
else : while(Stack.top()!=op[1]): Stack.pop() Stack.pop()
if(Stack.is_empty()) : print("Empty")
else: print(Stack.top())
|