数据结构栈队列相关代码(数据结构笔试复测Leecode牛客)

Posted 小葵花幼儿园园长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构栈队列相关代码(数据结构笔试复测Leecode牛客)相关的知识,希望对你有一定的参考价值。

栈、队列

基础介绍

  • 栈是一种只能在一端进行插入或删除操作的线性表。
  • 特点:先进后出
  • 分类:顺序栈和链栈

基础

【模板】栈

定义、进栈、出栈

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 5;
int st[N];
int top = -1;

int main()

    int n;
    cin>>n;
       
    while(n--)
    
        string c;
        cin>>c;
        if(c == "push")
        
            int x;
            cin>>x;
            st[++top] = x;
        else if(c == "top")
            if(top == -1)
                cout<<"error"<<endl;
            else
                cout<<st[top]<<endl;
            
        else if(c == "pop")
            if(top == -1)
                cout<<"error"<<endl;
            else
                cout<<st[top--]<<endl;
            
        
    
    return 0;
    

栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。

class Solution 
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) 
        stack<int> data; //构建栈
        int j = 0;
        for(int i = 0; i < pushV.size(); i++)
        
            data.push(pushV[i]); //进栈
            while(data.size() > 0 && popV[j] == data.top())
            
                data.pop();
                j++;
            
        
        return data.empty();
    
;

有效括号序列

给出一个仅包含字符’(’,’)’,’’,’’,’[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列

class Solution 
public:
    /**
     * 
     * @param s string字符串 
     * @return bool布尔型
     */
    bool isValid(string s) 
        // write code here
        stack<char> data;
        
        int n = s.length();
        if(n%2 != 0)
            return false;
        
        for(int i = 0; i<n; i++)
        
            if(data.size() == 0)
                data.push(s[i]);
            else
                if(data.top() == '(' && s[i] == ')') 
                   data.pop();
                else if(data.top() == '[' && s[i] == ']') 
                   data.pop();
                else if(data.top() == '' && s[i] == '') 
                   data.pop();
                else 
                    data.push(s[i]);
            
            
        
        if(data.empty())
            return true;
        else
            return false;
        
    
;

逆波兰表达式求值

给定一个逆波兰表达式,求表达式的值。

逆波兰表达式和日常书写的表达式区别是符号会后置。

class Solution 
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param tokens string字符串vector 
     * @return int整型
     */
    int evalRPN(vector<string>& tokens) 
        // write code here
        stack<int> data;
        for(int i = 0; i<tokens.size(); i++)
        
            if(tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/")
                
                int t = atoi(tokens[i].c_str());//string-->int
                data.push(t);
            
            else
                int num = data.top();
                data.pop();
                if(tokens[i] == "+")
                    data.top() += num;
                else if(tokens[i] == "-")
                    data.top() -= num;
                else if(tokens[i] == "*")
                    data.top() *= num;
                else if(tokens[i] == "/")
                    data.top() /= num;
                
            
        
        return data.top();
    
;

点击消除

牛牛拿到了一个字符串。
他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"。
但相同而不相邻、不相同的相邻字母都是不可以被消除的。
牛牛想把字符串变得尽可能短。他想知道,当他点击了足够多次之后,字符串的最终形态是什么?

#include <bits/stdc++.h>
using namespace std;

int main()

    string data;
    cin>>data;
    stack<char> xc1;
    //消除
    for(auto& i: data)
    
        if(!xc1.empty() && xc1.top() == i)
            xc1.pop();
        else
            xc1.push(i);  
    
    
    //读取
    stack<char> xc2;
    while(!xc1.empty())
    
        xc2.push(xc1.top());
        xc1.pop();
    
    
    if(xc2.empty())
    
        cout<<0<<endl;
        return 0;
    
    
    //输出
    while(!xc2.empty())
    
        cout<<xc2.top();
        xc2.pop();
        
    
    return 0;

表达式求解

请写一个整数计算器,支持加减乘三种运算和括号。
空间复杂度: O(n),时间复杂度 O(n)

两个栈、一个存放运算符、一个存放数值

class Solution 
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string s) 
        // write code here
        stack<int> num;//存放数值
        stack<char> ops;//存放运算符
        int sum = 0;//初始化计算值
        for(int i=0; i<s.size(); i++)
        
            if(s[i]>='0' && s[i]<='9')
                sum = sum*10 +(s[i] - '0');//大于10的数值
            else
            
                if(sum!=0)
                
                    num.push(sum);//将数值入栈
                    sum = 0;
                
                if(ops.empty() || ops.top() == '(' || s[i] == '(')
                    ops.push(s[i]);
                else
                    if(s[i] == ')')
                        while(ops.top() != '(')
                            int x = num.top();
                            num.pop();
                            int y = num.top();
                            num.pop();
                            if(ops.top() == '+')
                                num.push(x+y);
                            else if(ops.top() == '-')
                                num.push(y-x);
                            else if(ops.top() == '*')
                                num.push(x*y);
                            ops.pop();
                        
                        ops.pop();
                    else
                        while(!ops.empty() && judge(s[i], ops.top()) == false)
                        
                            int x = num.top();
                            num.pop();
                            int y = num.top();
                            num.pop();
                            if(ops.top() == '+')
                                num.push(x+y);
                            else if(ops.top() == '-')
                                num.push(y-x);
                            else if(ops.top() == '*')
                                num.push(x*y);
                            ops.pop();
                        
                        ops.push(s[i]);
                    
                           
                    
            
        
            
       if(sum!=0)
       num.push(sum);
       while(!ops.empty())
       
           int x = num.top();
           num.pop();
           int y = num.top();
           num.pop();
           if(ops.top() == '+')
               num.push(x+y);
           else if(ops.top() == '-')
               num.push(y-x);
           else if(ops.top() == '*')
               num.push(x*y);
           ops.pop();
       
        return num.top();
    
    
    bool judge(char c1, char c2)
    
        if(c1 == '(')
            return true;
        else if(c1 == ')')
            return false;
        else if(c2 == '(')
            return true;
        else if((c1 == '*' || c1 == '/') && (c2 == '+' || c2=='-') )
            return true;
        else
            return false;
    
;

进阶

队列

基础

【模板】队列

#include <bits/stdc++.h>
using namespace std;

const int maxSize = 1e5 + 5;

int main()

    //构建队列
    int data[maxSize];
    int front = 0; //队头
    int rear = 0; //队尾
    
    int n;
    cin>>n;
    
    while(n--)
    
        string c;
        cin>>c;
        if(c =="push")
        
            int x;
            cin>>x;
            data[rear] = x;
            rear = (rear+1) % maxSize;
        else if(c == "pop")
        
            if(front == rear)
                cout<<"error"<<endl;
            else
                cout<<data[front]<<endl;     
                front = (front+1) % maxSize;
            
        else if(c == "front")
        
             if(front == rear)
                cout<<"error"<<endl;
            else
                cout<<data[front]<<endl;
        
    
    return 0;

【模板】循环队列

#include <bits/stdc++.h>
using namespace std;



int main()

    //构建队列
    int n;
    cin>>n;
    n = n+1;//多一个空间
    int data[n];
    int front = 0; //队头
    int rear = 0; //队尾
    
    int q;
    cin>>q;
    
    while(q--)
    
        string c;
        cin>>c;
        if(c =="push")
        
            int x;
            cin>>x;
            if((rear+1)%n == front)
                cout<<"full"<<endl;
            else
                data[rear] = x;
                rear = (rear+1) % n;
            
        else if(c == "pop")
        
            if(front == rear)
                cout<<"empty"<<endl;
            else
                cout<<data[front]<<endl;     
                front = (front+1) % n;
            
        else if(c == "front")
        
             if(front == rear)
                cout<<"empty"<<endl;以上是关于数据结构栈队列相关代码(数据结构笔试复测Leecode牛客)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构数组相关代码(数据结构笔试复测Leecode牛客)

数据结构字符串相关代码(数据结构笔试复测Leecode牛客)

关于排序的相关代码(数据结构笔试复测Leecode牛客)

数据结构树相关代码(数据结构笔试复测Leecode牛客)

基础算法(数据结构笔试复测Leecode牛客)

动态规划(数据结构笔试复测Leecode牛客)