zoukankan      html  css  js  c++  java
  • 如何判断出栈序列合理性

    1.原理

    模拟栈的入栈和出栈,根据较大的数先出栈, 比它小的数必须由大到小出栈,但不一定连续出栈

    如: 3 2 1 5 4   或者 3 2 5 4 1 ————3先出栈,2和1必须由大到小出栈,他们可以连续出栈也可以在中间隔着几个数,但1在2前出栈坑定是不行的,如 3 1 2 5 4 或3 1 5 4 2,这都是不合理的顺序

    2.代码实现


    这里使用了之前学习栈编写的Stack类  http://blog.csdn.net/u012763794/article/details/50931335
    当然你也可以C++自带的,在开头加#include <stack> ,如声明一个int类型的栈 stack<int> s;  具体使用可看看这http://www.cnblogs.com/mfryf/archive/2012/08/09/2629992.html

    #include<iostream>
    #include<string>
    #include <cassert>
    
    using namespace std;
    
    template<class Type> class Stack{
    private:
    	Type *elements;
    	int max_size, top_index;
    public:
    	//构造函数
    	Stack(int length_input){
    		elements = new Type[length_input];
    		max_size = length_input;
    		top_index = -1;
    	}
    	//析构函数
    	~Stack(){
    		delete[] elements;
    	}
    	//入栈
    	bool push(const Type &element){
    		//是否超过栈容量
    		if (top_index >= max_size-1) {
    			return false;
    		}
    		//栈顶向上移,并赋值
    		top_index++;
    		elements[top_index] = element;
    		return true;
    	}
    	//出栈
    	bool pop(){
    		//判断栈是否为空
    		if (top_index < 0) {
    			return false;
    		}
    		//栈顶向下移
    		top_index--;
    		return true;
    	}
    	//获取栈顶元素
    	Type top(){
    		assert(top_index >= 0);
    		return elements[top_index];
    		//或者 
    		//if (!empty()) {
    		//	return elements[top_index];
    		//}else{
    		//	exit("there is no element");
    		//}
    	}
    	//判断栈是否为空
    	bool empty(){
    		if (top_index < 0) {
    			return true;
    		}else{
    			return false;
    		}
    	}
    };
    
    int main() {
    	//n:	连续正整数的个数
    	//minimum:	还没压入栈的最小的序号
    	int n, minimum = 1;
        cin >> n;
    	int *p = new int[n];
    	//判断出栈顺序是否合理的标识
    	bool flag = true;
    	Stack<int> stack(n);
    	
    	//输入要判断的出栈顺序
    	for (int i = 0; i <n ; i++) {
    		cin>>p[i];
    	}
    	for (i = 0; i <n ; i++) {
    		//如果大于还没压入栈的最小的序号,就从还没压入栈的最小的序号到自身都依次压入栈
    		if (p[i] >= minimum) {
    			for (int j = minimum; j <=p[i] ; j++) {
    				stack.push(j);
    			}
    			//还要更新还没压入栈的最小的序号,要加1,因为p[i]已经压进去了
    			minimum = p[i] + 1;
    		}else{
    		//进入这里,说明p[i]已经被压入栈了
    
    			//判断栈顶是否等于该数,
    			//因为大的数先出栈,那么比它小的数必须也是从大到小出栈,但不一定从大到小连续出栈
    			//如 3 2 1 5 4  或者 3 2 5 4 1
    			//1一定不能先于2 ,如 3 1 5 4 2 ,3 1 2 5 4,这都是不合理的出栈顺序
    			if (stack.top() != p[i]){
    				flag = false;
    				break;
    			}
    		}
    		//出栈(经过上面的if,else,能保证出栈顺序能像自己手动输入一样[如果出栈顺序是合理的话])
    		stack.pop();
    	}
    	
    	if (flag) {
    		cout<<"YES";
    	}else{
    		cout<<"NO";
    	}
        return 0;
    }

    3.测试结果




  • 相关阅读:
    什么样的代码称得上是好代码?
    九年程序人生 总结分享
    Docker入门 第一课 --.Net Core 使用Docker全程记录
    阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅
    Visual studio 2015 Community 安装过程中遇到问题的终极解决
    Activiti6.0 spring5 工作流引擎 java SSM流程审批 项目框架
    java 进销存 库存管理 销售报表 商户管理 springmvc SSM crm 项目
    Leetcode名企之路
    24. 两两交换链表中的节点
    21. 合并两个有序链表
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286559.html
Copyright © 2011-2022 走看看