小工具知识网

当前位置: 首页 > 行业知识 > 第三章节 栈和队列

行业知识

第三章节 栈和队列

2026-10-30 21:21:31 来源:互联网转载

参考:1.���据结构C语言版|第2版;2.力扣;3.2025年数据结构考研复习指导。三个参考分别依次对应文章三个部分。

()

文章目录

  • 第一部分
    • 栈
      • 基本概念
      • 栈的实现
        • 顺序栈的实现
        • 链栈的实现
        • 经典案例
          • 进制转换
          • 括号匹配
          • 求解表达式的结果
          • 队列
            • 基本概念
            • 队列的实现
              • 顺序队列的实现
              • 链队列的实现
              • 经典案例
                • 舞伴问题
                • 递归
                  • 基本概念
                  • 经典应用
                    • 函数定义
                    • 某种操作
                    • 递归分析
                    • 递归与栈
                    • 第二部分
                      • 栈
                          • 20. 有效的括号
                          • 32. 最长有效括号
                          • 1047. 删除字符串中的所有相邻的重复项
                          • 1190. 反转每对括号间的子串
                          • 单调栈
                            • 42. 接雨水
                            • 84. 柱状图中的最大矩形
                            • 85. 最大矩形
                            • 456. 132模式
                            • 496. 下一个更大元素I
                            • 503. 下一个更大元素II
                            • 739. 每日温度
                            • 1475. 商品折扣后的最终价格
                            • 2454. 下一个更大元素IV
                            • 队列
                                • 649. Dota2参议院
                                • 1047. 删除字符串中的所有相邻的重复项
                                • 1190. 反转每对括号间的子串
                                • 单调队列
                                  • 239. 滑动窗口的最大值
                                  • 第三部分

                                    第一部分

                                    栈

                                    基本概念

                                    栈的定义:栈是限定仅在表尾进行插入和删除操作的线性表。栈顶、栈底、空栈(顾名思义)。栈的特点:后进先出。

                                    ()

                                    栈的实现

                                    顺序栈的实现

                                    顺序栈(顾名思义)

                                    #includeusing namespace std;struct Stack{    int max_size;    int now_size;    int * datas;};void Init(Stack & my_stack,int max_size){    my_stack.max_size=max_size;    my_stack.now_size=0;    my_stack.datas=new int [max_size];}void Destroy(Stack & my_stack){    my_stack.max_size=-1;    my_stack.now_size=-1;    delete [] my_stack.datas;}bool IsEmpty(const Stack & my_stack){    return my_stack.now_size==0;}int GetSize(const Stack & my_stack){    return my_stack.now_size;}int GetTop(const Stack & my_stack){    if (IsEmpty(my_stack)) {cout    if (my_stack.now_size==my_stack.max_size) cout    if (IsEmpty(my_stack)) cout    Stack my_stack;Init(my_stack,10);    for (int i=0;i    int data;    Node * next;};void InitNode(Node * & node){    node=new Node;node-next=nullptr;}void InitStack(Node * & my_stack){    my_stack=nullptr;}void DestoryNode(Node * & node){    delete node;}void DestoryStack(Node * & my_stack){    while (my_stack!=nullptr)    {        Node * temp=my_stack;my_stack=my_stack-next;DestoryNode(temp);    }}bool IsEmpty(Node * & my_stack){    return my_stack==nullptr;}int GetSize(Node * & my_stack){    int result=0;Node * temp=my_stack;    while (temp!=nullptr) {temp=temp-next;result+=1;}    return result;}int GetTop(Node * & my_stack){    if (IsEmpty(my_stack)) {cout    Node * next;InitNode(next);next-data=data;    next-next=my_stack;my_stack=next;}void Pop(Node * & my_stack){    if (IsEmpty(my_stack)) cout    Node * my_stack;InitStack(my_stack);    for (int i=0;i    stackmy_stack.push(n%8);n/=8;}    int x=0;    while (!my_stack.empty()) {x*=10;x+=my_stack.top();my_stack.pop();}    return x;}int main(){    coutpublic:    bool isValid(string s) {        stack                if (my_stack.empty() or\                   (s[i]==')' and my_stack.top()!='(') or\                   (s[i]==']' and my_stack.top()!='[') or\                   (s[i]=='}' and my_stack.top()!='{'))                    return false;                my_stack.pop();            }        if (!my_stack.empty()) return false;        return true;    }};    int x=s[0]-'0',len=1;    while (s[len]='0' and s[len]        x*=10;x+=s[len]-'0';len+=1;    }    return make_pair(x,len);}double calculate(char * s){    int i=0;stack        if (s[i]='0' and s[i]            pair                double x=my_stack1.top();my_stack1.pop();char y=my_stack2.top();my_stack2.pop();                if (y=='*') my_stack1.push(x*temp.first);                else my_stack1.push(x/temp.first);            }            else my_stack1.push(temp.first);            i+=temp.second;            continue;        }        else if (s[i]!=')') my_stack2.push(s[i]);        else        {            while (my_stack2.top()!='(')            {                double x=my_stack1.top();my_stack1.pop();                double y=my_stack1.top();my_stack1.pop();                char z=my_stack2.top();my_stack2.pop();                if (z=='+') my_stack1.push(y+x);                else my_stack1.push(y-x);            }            my_stack2.pop();            if (!my_stack2.empty() and (my_stack2.top()=='*' or my_stack2.top()=='/'))            {                double x=my_stack1.top();my_stack1.pop();                double y=my_stack1.top();my_stack1.pop();                char z=my_stack2.top();my_stack2.pop();                if (z=='*') my_stack1.push(y*x);                else my_stack1.push(y/x);            }        }        i+=1;    }    while (!my_stack2.empty())    {        double x=my_stack1.top();my_stack1.pop();        double y=my_stack1.top();my_stack1.pop();        char z=my_stack2.top();my_stack2.pop();        if (z=='+') my_stack1.push(y+x);        else my_stack1.push(y-x);    }    double temp=my_stack1.top();my_stack1.pop();return temp;}int main(){    //首先式子必须合法,然后数字必须为整。    char s1[]="1+2+3+4+5+6+7+8+9";    char s2[]="1*2*3*4*5*6*7*8*9";    char s3[]="(1+2)+(3+4)+(5+6)+(7+8)";    char s4[]="(1*2)*(3*4)*(5*6)*(7*8)";    char s5[]="(1+2)*(3+4)*(4+6)*(7+8)";    char s6[]="(1*2)+(3*4)+(4*6)+(7*8)";    char s7[]="((1*2)+(3*4))*((5*6)+(7*8))";    char s8[]="1+5*((10*20+1)+(1+30*400))*((400*30+1)+(1+20*10))*5+1";    cout    int max_size;    int * data;    int begin;    int end;};void Init(Queue & my_queue,int max_size){    my_queue.max_size=max_size;    my_queue.data=new int [max_size];    my_queue.begin=0;    my_queue.end=0;}void Destroy(Queue & my_queue){    my_queue.max_size=-1;    delete [] my_queue.data;    my_queue.begin=-1;    my_queue.end=-1;}int GetSize(const Queue & my_queue){    return (my_queue.end-my_queue.begin+my_queue.max_size)%my_queue.max_size;}bool IsFull(const Queue & my_queue){    return GetSize(my_queue)==my_queue.max_size-1;}bool IsEmpty(const Queue & my_queue){    return GetSize(my_queue)==0;}void Push(Queue & my_queue,int data){    if (IsFull(my_queue)) {cout    if (IsEmpty(my_queue)) {cout    if (IsEmpty(my_queue)) {cout    if (IsEmpty(my_queue)) {cout    Queue my_queue;Init(my_queue,10);    for (int i=0;i    int data;    Node * next;};void InitNode(Node * & node){    node=new Node;node-next=nullptr;}void DestroyNode(Node * & node){    delete node;}struct Queue{    Node * begin;    Node * end;};void InitQueue(Queue & my_queue){    my_queue.begin=nullptr;my_queue.end=nullptr;}void DestroyQueue(Queue & my_queue){    while (my_queue.begin!=nullptr)    {        Node * temp=my_queue.begin;my_queue.begin=my_queue.begin-next;DestroyNode(temp);    }}void Push(Queue & my_queue,int data){    Node * node=new Node;InitNode(node);node-data=data;    if (my_queue.end==nullptr) {my_queue.begin=node;my_queue.end=node;}    else {my_queue.end-next=node;my_queue.end=my_queue.end-next;}}void Pop(Queue & my_queue){    if (my_queue.begin==nullptr) {cout    return my_queue.begin-data;}int GetBack(Queue & my_queue){    return my_queue.end-data;}int GetSize(Queue & my_queue){    int result=0;Node * temp=my_queue.begin;    while (temp!=nullptr) {temp=temp-next;result+=1;}    return result;}bool IsEmpty(Queue & my_queue){    return my_queue.end==nullptr;}int main(){    Queue my_queue;InitQueue(my_queue);    for (int i=0;i    if (my_queue1.size()my_queue2.size())     {        queue        cout    string lb1[1]={"LCL"};    string lb2[3]={"GNZ","YHC","WMQ",};    queue    if (n==0) return 1;    return n*factorial(n-1);}    cout    if (n==1) move(A,1,C);    else    {        Hanoi(n-1,A,C,B);move(A,n,C);Hanoi(n-1,B,A,C);    }}int main(){    Hanoi(4,'A','B','C');    return 0;}    if (my_vector.empty()) return;    cout    if (my_queue.empty()) return;    cout    if (my_stack.empty()) return;    cout    vector        my_vector.push_back(i);my_queue.push(i);my_stack.push(i);    }    func1(my_vector);coutpublic:    bool isValid(string s) {        stack                if (my_stack.empty() or\                   (s[i]==')' and my_stack.top()!='(') or\                   (s[i]==']' and my_stack.top()!='[') or\                   (s[i]=='}' and my_stack.top()!='{'))                    return false;                my_stack.pop();            }        if (!my_stack.empty()) return false;        return true;    }};public:    int longestValidParentheses(string s) {        int result=0;        stack                my_stack.pop();                if (my_stack.empty()) my_stack.push(i);                else result=max(result,i-my_stack.top());            }        return result;    }};public:    string removeDuplicates(string s) {        stack                if (s[i]==z.top()) z.pop();                else z.push(s[i]);            }        string result;        while (!z.empty()) {result+=z.top();z.pop();}        reverse(result.begin(),result.end());        return result;    }};public:    string reverseParentheses(string s) {        stack                string s_temp;                while (1)                {                    if (z.top()=='(')                    {                        z.pop();                        for (int i=0;iresult+=z.top();z.pop();}        reverse(result.begin(),result.end());        return result;    }};public:    int trap(vector        int result=0;        stack            while (!my_stack.empty() and height[i]=height[my_stack.top()])            {                top=my_stack.top();my_stack.pop();                if (!my_stack.empty())                    result+=(min(height[my_stack.top()],height[i])-height[top])*(i-my_stack.top()-1);            }            my_stack.push(i);        }        return result;    }};public:    int largestRectangleArea(vector        vector            while (!my_stack1.empty() and heights[i]                my_vector1[my_stack1.top()]=i;my_stack1.pop();            }            my_stack1.push(i);        }        vector            while (!my_stack2.empty() and heights[i]                my_vector2[my_stack2.top()]=i;my_stack2.pop();            }            my_stack2.push(i);        }        int result=0;        for (int i=0;i            int r,l;            if (my_vector1[i]==-1) r=heights.size()-1-i;            else r=my_vector1[i]-1-i;            if (my_vector2[i]==-1) l=i;            else l=i-1-my_vector2[i];            int result_temp=heights[i]*(r+l+1);            if (result_tempresult) result=result_temp;        }        return result;    }};public:    int maximalRectangle(vector        vector            int result_temp=fc(my_matrix[i]);            if (result_tempresult) result=result_temp;        }        return result;    }    int fc(const vector        vector            while (!my_stack1.empty() and heights[i]                my_vector1[my_stack1.top()]=i;my_stack1.pop();            }            my_stack1.push(i);        }        vector            while (!my_stack2.empty() and heights[i]                my_vector2[my_stack2.top()]=i;my_stack2.pop();            }            my_stack2.push(i);        }        int result=0;        for (int i=0;i            int r,l;            if (my_vector1[i]==-1) r=heights.size()-1-i;            else r=my_vector1[i]-1-i;            if (my_vector2[i]==-1) l=i;            else l=i-1-my_vector2[i];            int result_temp=heights[i]*(r+l+1);            if (result_tempresult) result=result_temp;        }        return result;    }};public:    bool find132pattern(vector        stack            if (nums[i]                 k=max(k,my_stack.top());my_stack.pop();            }            my_stack.push(nums[i]);        }        return false;}};public:    vector        unordered_map            while (!mystack.empty() and nums2[i]mystack.top())            {                zd[mystack.top()]=nums2[i];mystack.pop();            }            mystack.push(nums2[i]);        }        while (!mystack.empty())        {            zd[mystack.top()]=-1;mystack.pop();        }        vectorpublic:    vector        vector            while (!my_stack.empty() and nums[i]nums[my_stack.top()])            {                result[my_stack.top()]=nums[i];my_stack.pop();            }            my_stack.push(i);        }        while (!my_stack.empty())        {            for (int i=0;i                    result[my_stack.top()]=nums[i];break;                }            my_stack.pop();        }        return result;    }};public:    vector        vector            while (!my_stack.empty() and temperatures[i]temperatures[my_stack.top()])            {                my_vector[my_stack.top()]=i-my_stack.top();my_stack.pop();            }            my_stack.push(i);        }        return my_vector;    }};public:    vector        stack            while (!my_stack.empty() and prices[i]                prices[my_stack.top()]-=prices[i];my_stack.pop();            }            my_stack.push(i);        }        return prices;    }};public:    vector        vector            while (!my_stack2.empty() and nums[i]nums[my_stack2[my_stack2.size()-1]])            {                result[my_stack2[my_stack2.size()-1]]=nums[i];my_stack2.pop_back();            }            if (!my_stack1.empty())            {                int j=my_stack1.size()-1;                while (j=0 and  nums[i]nums[my_stack1[j]]) j-=1;                j+=1;                my_stack2.insert(my_stack2.end(),my_stack1.begin()+j,my_stack1.end());                my_stack1.erase(my_stack1.begin()+j,my_stack1.end());            }            my_stack1.push_back(i);        }        return result;    }};public:    string predictPartyVictory(string senate) {        queue            if (dl1.empty()) {dl1.push(dl2.front());dl2.pop();}            else            {                if (dl2.front()==dl1.front()) {dl1.push(dl2.front());dl2.pop();}                else {dl2.pop();dl2.push(dl1.front());dl1.pop();}            }            if (dl2.empty()) break;        }        string result=dl1.front()=='D'?"Dire":"Radiant";        return result;    }};public:    string removeDuplicates(string s) {        deque                if (s[i]==sddl.back()) sddl.pop_back();                else sddl.push_back(s[i]);            }        string result;        while (!sddl.empty()) {result+=sddl.front();sddl.pop_front();}        return result;    }};public:    string reverseParentheses(string s) {        deque                string s_temp;                while (1)                {                    if (sddl.back()=='(')                    {                        sddl.pop_back();                        for (int i=0;iresult+=sddl.front();sddl.pop_front();}        return result;    }};public:    vector        vector            while (!sddl.empty() and nums[i]sddl.back())                sddl.pop_back();            sddl.push_back(nums[i]);        }        result.push_back(sddl.front());        for (int i=k;i            while (!sddl.empty() and nums[i]sddl.back())                sddl.pop_back();            sddl.push_back(nums[i]);            if (nums[i-k]==sddl.front())                sddl.pop_front();            result.push_back(sddl.front());        }        return result;    }};

上一篇:Docker新手速成指南,轻松掌握容器化应用的快速启动流程!

下一篇:服务器一般怎么连线外网?