zoukankan      html  css  js  c++  java
  • 面试题31:栈的压入、弹出序列

    栈的压入、弹出序列,很经典。

    C++版本

    #include <iostream>
    #include <vector>
    #include <stack>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    // 定义辅助栈
    stack<int> stack1;
    
    bool IsPopOrder(vector<int> pushV, vector<int> popV){
        bool isPopOrder = false;
        int pushLength = pushV.size();
        int popLength = popV.size();
    
        if(pushLength > 0 && popLength > 0 && (pushLength == popLength)){
            isPopOrder = true;
            // 定义标记数组
            bool vis[pushLength];
            memset(vis, false, sizeof(vis));
    
            for(int i = 0; i < popLength; i++){
                // 下一个弹出的数字
                int popValue = popV[i];
                // 如果下一个弹出的数字刚好是栈顶数字,直接弹出
                if(stack1.size() > 0 && stack1.top() == popValue){
                    stack1.pop();
                }
    
                // 如果下一个弹出的数字不在栈顶,则把压栈序列中还没有入栈的数字压入辅助栈
                else if(stack1.size() == 0 || stack1.top() != popValue){
                    // 定义在未入栈的序列中是否找到需要弹出的数字
                    bool flag = false;
                    for(int j = 0; j < pushLength; j++){
                        // 判断该值是否已入栈
                        if(!vis[j]){
                            stack1.push(pushV[j]);
                            vis[j] = true;
                            // 在未入栈的序列中找到了需要弹出的数字
                            if(pushV[j] == popValue){
                                // 出栈
                                stack1.pop();
                                flag = true;
                                break;
                            }
                        }
                    }
                    if(!flag){
                        cout<<"AAA"<<popValue<<endl;
                        isPopOrder = false;
                        break;
                    }
                }
                vector<int> vec_stack;
                cout<<"**********************"<<endl;
                while(!stack1.empty()){
                    vec_stack.push_back(stack1.top());
                    cout<<stack1.top()<<endl;
                    stack1.pop();
                }
                cout<<"**********************"<<endl;
                for(int k = vec_stack.size() - 1; k >= 0; k--){
                    stack1.push(vec_stack[k]);
                }
            }
        }
        return isPopOrder;
    }
    
    int main()
    {
        vector<int> pushV;
        pushV.push_back(1);
        pushV.push_back(2);
        pushV.push_back(3);
        pushV.push_back(4);
        pushV.push_back(5);
        vector<int> popV;
        popV.push_back(4);
        popV.push_back(5);
        popV.push_back(3);
        popV.push_back(2);
        popV.push_back(1);
    
        if(IsPopOrder(pushV, popV))
            cout<<"yes"<<endl;
        else
            cout<<"no."<<endl;
        return 0;
    }
    
  • 相关阅读:
    C#学习之委托和事件
    ArcGIS许可启动问题
    空间插值——克里金插值
    maven 问题解决 tools以及jconsole两个jar包 无效
    JDBC代码示例
    mysql 同一IP 产生太多终端的数据库连接导致阻塞
    apache 反向代理配置
    oracle、mysql、sql server等;流行数据库的链接驱动配置
    POI XSSF与HSSF的 使用区别
    使用IDEA开发Activiti工作流
  • 原文地址:https://www.cnblogs.com/flyingrun/p/13387554.html
Copyright © 2011-2022 走看看