栈及其有关函数

栈是基本的数据结构之一。

栈的特点:先进后出。

头文件为:

#include<stack>

栈的有关操作

stack<Type>s;                           //定义栈,Type为数据类型,例如 int,float,char等

s.push(item);                          //把item放到栈顶

s.top();                               //返回栈顶元素,但不会删除

s.pop();                            //删除栈顶的元素,但不会返回,在出栈时先top()获得栈顶元 
                                       素,再pop()删除栈顶元素

s.size();                                //返回栈中元素个数

s.empty();                             //检查栈是否为空,如果为空,返回ture,否则返回false

题目描述

请你实现一个栈(stack),支持如下操作:

  • push(x):向栈中加入一个数 𝑥x。
  • pop():将栈顶弹出。如果此时栈为空则不进行弹出操作,输出 Empty
  • query():输出栈顶元素,如果此时栈为空则输出 Anguei!
  • size():输出此时栈内元素个数。

输入格式

本题单测试点内有多组数据
输入第一行是一个整数 T,表示数据组数。对于每组数据,格式如下:
每组数据第一行是一个整数,表示操作的次数 n。
接下来 𝑛n 行,每行首先由一个字符串,为 pushpopquery 和 size 之一。若为 push,则其后有一个整数 𝑥x,表示要被加入的数,𝑥x 和字符串之间用空格隔开;若不是 push,则本行没有其它内容。

输出格式

对于每组数据,按照「题目描述」中的要求依次输出。每次输出占一行。

数据规模与约定

对于全部的测试点,保证1≤T,n≤106,且单个测试点内的 n 之和不超过 106,即∑n≤106。保证0≤x<2的64次方。

注意:由于数据范围过大,因此数据应定义时用unsigned long long。

代码如下

#include<bits/stdc++.h>
using namespace std; 
#include<stack>
int main()
{
	int n;
    cin >> n;
    while(n--)
    {
    	stack<unsigned long long int>q;
        int x;
        string t;
        cin >> x;
        while(x--)
        {
        	cin>>t;
        	if (t == "push") 
		{
			unsigned long long y;
			cin >> y;
			q.push(y);
		}
        else if (t=="pop")
        {
            if (q.empty()) 
			cout << "Empty"<<endl;
            else 
			q.pop();
        }
        else if (t=="query")
        {
            if (q.empty()) 
			cout <<"Anguei!"<<endl;
            else 
			cout << q.top() << endl;
        }
        else if(t=="size")
		 cout << q.size() << endl;
		}
    }
    return 0;
}

### Java 中与相关的函数和方法 #### 1. **`Stack<T>` 类** `Stack<T>` 是 `Vector<T>` 的子类,提供了基本的操作功能。以下是常用的方法及其说明: - **`push(E item)`**: 向顶压入一个元素。 ```java Stack<Integer> stack = new Stack<>(); stack.push(1); ``` - **`pop()`**: 移除并返回顶元素。如果为空,则抛出异常。 ```java int topElement = stack.pop(); ``` - **`peek()`**: 返回顶元素而不移除它。如果为空,则抛出异常。 ```java int topElement = stack.peek(); ``` - **`empty()`**: 如果为空则返回 `true`,否则返回 `false`。 ```java boolean isEmpty = stack.empty(); ``` - **`search(Object o)`**: 返回指定对象在中的位置(从顶开始计数),如果没有找到该对象,则返回 `-1`[^2]。 --- #### 2. **`ArrayDeque<T>` 类作为实现** 虽然 `Stack<T>` 被认为过时,但可以使用双向队列 `ArrayDeque<T>` 来模拟的行为。其性能优于传统的 `Stack<T>` 实现。 - **`addFirst(E e)` 或 `offerFirst(E e)`**: 添加元素到双端队列的一端(相当于的 push 操作)。 ```java ArrayDeque<Integer> deque = new ArrayDeque<>(); deque.addFirst(1); // 等价于 push ``` - **`removeFirst()` 或 `pollFirst()`**: 删除并返回第一个元素(相当于的 pop 操作)。如果队列为空,`removeFirst()` 抛出异常而 `pollFirst()` 返回 null。 ```java Integer element = deque.removeFirst(); // 等价于 pop ``` - **`getFirst()` 或 `peekFirst()`**: 查看第一个元素而不删除它(相当于的 peek 操作)。如果队列为空,`getFirst()` 抛出异常而 `peekFirst()` 返回 null。 ```java Integer firstElement = deque.getFirst(); // 等价于 peek ``` --- #### 3. **其他辅助方法** - **`isEmpty()`**: 判断容器是否为空。 ```java boolean empty = deque.isEmpty(); ``` - **`size()`**: 获取当前中元素的数量。 ```java int size = deque.size(); ``` --- #### 示例代码:使用 `ArrayDeque` 模拟 ```java import java.util.ArrayDeque; import java.util.Deque; public class Main { public static void main(String[] args) { Deque<Integer> stack = new ArrayDeque<>(); // Push elements onto the stack stack.addFirst(10); stack.addFirst(20); System.out.println("Top of stack: " + stack.peekFirst()); // Pop an element from the stack int poppedValue = stack.pollFirst(); System.out.println("Popped value: " + poppedValue); // Check if the stack is empty System.out.println("Is stack empty? " + stack.isEmpty()); } } ``` --- #### 功能扩展:自定义类 可以通过继承或组合的方式创建自己的类,并封装所需的功能。 ```java import java.util.ArrayList; import java.util.List; class CustomStack<T> { private List<T> data = new ArrayList<>(); public void push(T item) { data.add(item); } public T pop() { if (data.isEmpty()) throw new IllegalStateException("Stack is empty"); return data.remove(data.size() - 1); } public T peek() { if (data.isEmpty()) throw new IllegalStateException("Stack is empty"); return data.get(data.size() - 1); } public boolean isEmpty() { return data.isEmpty(); } } // 使用示例 CustomStack<String> customStack = new CustomStack<>(); customStack.push("A"); System.out.println(customStack.pop()); // 输出 A ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值