栈(Stack)和队列(Queue)

彦祖天天见

栈(Stack)和队列(Queue)是两种常见的数据结构,它们都是线性数据结构,但在元素的插入和删除方式上有所不同。

栈(Stack):

  • 栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构。
  • 元素的插入和删除操作只能在栈的顶部进行。
  • 插入操作称为入栈(Push),删除操作称为出栈(Pop)。
  • 栈的顶部元素是最后一个插入的元素,也是唯一可以访问的元素。
  • 栈的应用包括函数调用、表达式求值、括号匹配等。

队列(Queue):

  • 队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。
  • 元素的插入操作只能在队列的尾部进行,删除操作只能在队列的头部进行。
  • 插入操作称为入队(Enqueue),删除操作称为出队(Dequeue)。
  • 队列的头部元素是最先插入的元素,也是唯一可以访问的元素。
  • 队列的应用包括任务调度、缓冲区管理、广度优先搜索等。

在C++中,可以使用标准库中的std::stackstd::queue来实现栈和队列。这些容器提供了相应的成员函数和操作符来进行元素的插入、删除和访问操作。

#include <iostream>
#include <stack>
#include <queue>

int main() {
    // 使用 std::stack 实现栈
    std::stack<int> myStack;

    // 入栈操作
    myStack.push(10);
    myStack.push(20);
    myStack.push(30);

    // 出栈操作
    while (!myStack.empty()) {
        int topElement = myStack.top();
        std::cout << "Top element: " << topElement << std::endl;
        myStack.pop();
    }

    // 使用 std::queue 实现队列
    std::queue<int> myQueue;

    // 入队操作
    myQueue.push(10);
    myQueue.push(20);
    myQueue.push(30);

    // 出队操作
    while (!myQueue.empty()) {
        int frontElement = myQueue.front();
        std::cout << "Front element: " << frontElement << std::endl;
        myQueue.pop();
    }

    return 0;
}

今天学习两道题目加深栈和队列的印象

232.用栈实现队列

class MyQueue {
public:
    stack<int> In;
    stack<int> Out;
    MyQueue() {
        
    }
    
    void push(int x) {
        In.push(x);
    }
    
    int pop() {
        if(Out.empty()){
            while(!In.empty()){
                Out.push(In.top());
                In.pop();
            }
        }
        int res=Out.top();
        Out.pop();
        return res;
    }
    
    int peek() {
        int res = this->pop();
        Out.push(res);
        return res;
    }
    
    bool empty() {       
        return In.empty()&&Out.empty();
    }
};

 

225.用队列实现栈

 

class MyStack {
public:
    queue<int> one;
    queue<int> two;
    MyStack() {

    }
    
    void push(int x) {
        one.push(x);
    }
    
    int pop() {
        int size=one.size();
        size--;
        while(size--){
            two.push(one.front());
            one.pop();
        }

        int res = one.front();
        one.pop();
        one = two;
        while(!two.empty()){
            two.pop();
        }
        return res;
    }
    
    int top() {
        return one.back();
    }
    
    bool empty() {
        return one.empty();
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用队列可以判断一个字符串是否为回文。具体步骤如下: 1. 将字符串中的所有字母转化为小写字母,并去除字符串中的空格和标点符号。 2. 将字符串中的每个字符依次添加到队列中。 3. 从队列中依次弹出字符进行比较,如果所有字符都相同,则字符串为回文,否则不是。 下面是 Java 代码实现: ``` import java.util.LinkedList; import java.util.Queue; import java.util.Stack; public class Palindrome { public static boolean isPalindrome(String str) { // 将字符串中的所有字母转化为小写字母,并去除空格和标点符号 str = str.toLowerCase().replaceAll("[^a-z0-9]", ""); // 将字符串中的每个字符依次添加到队列Stack<Character> stack = new Stack<>(); Queue<Character> queue = new LinkedList<>(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); stack.push(c); queue.offer(c); } // 从队列中弹出字符进行比较 while (!stack.isEmpty() && !queue.isEmpty()) { char c1 = stack.pop(); char c2 = queue.poll(); if (c1 != c2) { return false; } } return true; } public static void main(String[] args) { String str1 = "A man, a plan, a canal: Panama"; String str2 = "race a car"; System.out.println(isPalindrome(str1)); // 输出 true System.out.println(isPalindrome(str2)); // 输出 false } } ``` 在上面的代码中,我们首先将字符串中的所有字母转化为小写字母,并去除空格和标点符号,然后使用队列分别保存每个字符。最后从队列中依次弹出字符进行比较。如果所有字符都相同,则字符串为回文,否则不是。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值