【剑指offer】4.3 具体让抽象问题具体化

面试题21:包含min函数的栈

题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。

解答:代码如下:

stack<int> ValSta;
stack<int> MinSta;

void push(int value)
{
	ValSta.push(value);
	if(MinSta.empty() || (!MinSta.empty() && value < MinSta.top()))
	{
		MinSta.push(value);
	}
	else
	{
		MinSta.push(MinSta.top());
	}
}
    
void pop()
{
	if(!ValSta.empty())
	{
		ValSta.pop();
	}
	if(!MinSta.empty())
	{
		MinSta.pop();
	}
}
    
int top()
{
	if(!!ValSta.empty())
	{
		return ValSta.top();
	}
}

int min()
{
	if(!MinSta.empty())
	{
		return MinSta.top();
	}
}

面试题22:栈的压入、弹出序列

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。

解答:代码如下:

bool IsPopOrder(vector<int> pushV,vector<int> popV)
{
	if(pushV.size() == 0 || popV.size() == 0)
	{
		return false;
	}
        
	stack<int> sta;
	int i = 0;
	int j = 0;
	while(i < pushV.size())
	{
		sta.push(pushV[i++]);
		while(j < popV.size() && sta.top() == popV[j])
		{
			sta.pop();
			j++;
		}
	}
        
	return sta.empty();
}

面试题23:从上往下打印二叉树

题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。二叉树结点的定义如下:

struct BinaryTreeNode
{
	int             m_nValue;
	BinaryTreeNode* m_pLeft;
	BinaryTreeNode* m_pRight;
};

解答:代码如下:

vector<int> PrintFromTopToBottom(BinaryTreeNode* root)
{
	vector<int> vec;
	if(NULL == root)
	{
		return vec;
	}
        
	deque<BinaryTreeNode *> que;
	que.push_back(root);
	while(!que.empty())
	{
		BinaryTreeNode *pNode = que.front();
		que.pop_front();
		vec.push_back(pNode->m_nValue);
		if(pNode->m_pLeft != NULL)
		{
			que.push_back(pNode->m_pLeft);
		}
		if(pNode->m_pRight != NULL)
		{
			que.push_back(pNode->m_pRight);
		}
	}
        
	return vec;
}

面试题24:二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。

解答:代码如下:

bool Verify(vector<int> sequence,int left,int right)
{
	if(sequence.empty()|| left > right)
	{
		return false;
	}
        
	int root = sequence[right];
	int i = left;
	for(;i < right;i++)
	{
		if(sequence[i] > root)
		{
			break;
		}
	}

	for(int j = i;j < right;j++)
	{
		if(sequence[j] < root)
		{
			return false;
		}
	}
           
	bool Left = true;
	if(i > left)
	{
		Left = Verify(sequence,left,i - 1);
	}

	bool Right = true;
	if(i < right - 1)
	{
		Verify(sequence,i,right - 1);
	}
        
	return Left && Right;
}
    
bool VerifySquenceOfBST(vector<int> sequence)
{
	if(sequence.size() == 0)
	{
		return false;
	}
        
	return Verify(sequence,0,sequence.size() - 1);
}

面试题25:二叉树中和为某一值的路径

题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的结点形成一条路径。二叉树结点的定义如下:

struct BinaryTreeNode
{
	int             m_nValue;
	BinaryTreeNode* m_pLeft;
	BinaryTreeNode* m_pRight;
};

解答:代码如下:

void DFSfind(vector<vector<int>> &res,vector<int> &vec,BinaryTreeNode* root,int expectNumber,int sum)
{
	if(NULL == root)
	{
		return ;
	}
        
	vec.push_back(root->m_nValue);
	sum += root->m_nValue;
	if(root->m_pLeft == NULL && root->m_pRight == NULL && sum == expectNumber)
	{
		res.push_back(vec);
		sum = 0;
	}
	if(root->m_pLeft != NULL)
	{
		DFSfind(res,vec,root->m_pLeft,expectNumber,sum);
	}
	if(root->m_pRight != NULL)
	{
		DFSfind(res,vec,root->m_pRight,expectNumber,sum);
	}
	vec.pop_back();
}
    
vector<vector<int>> FindPath(BinaryTreeNode* root,int expectNumber)
{
	vector<vector<int>> res;
    
	if(NULL == root)
	{
		return res;
	}
        
	vector<int> vec;
	int sum = 0;
	DFSfind(res,vec,root,expectNumber,sum);
        
	return res;
}

 

内容概要:本文详细介绍了基于结构不变补偿的电液伺服系统低阶线性主动干扰抑制控制(ADRC)方法的实现过程。首先定义了电液伺服系统的基本参数,并实现了结构不变补偿(SIC)函数,通过补偿非线性项和干扰,将原始系统转化为阶积分链结构。接着,设计了低阶线性ADRC控制器,包含扩展状态观测器(ESO)和控制律,用于估计系统状态和总干扰,并实现简单有效的控制。文章还展示了系统仿真与对比实验,对比了低阶ADRC与传统PID控制器的性能,证明了ADRC在处理系统非线性和外部干扰方面的优越性。此外,文章深入分析了参数调整与稳定性,提出了频域稳定性分析和b0参数调整方法,确保系统在参数不确定性下的鲁棒稳定性。最后,文章通过综合实验验证了该方法的有效性,并提供了参数敏感性分析和工程实用性指导。 适合人群:具备定自动化控制基础,特别是对电液伺服系统和主动干扰抑制控制感兴趣的科研人员和工程师。 使用场景及目标:①理解电液伺服系统的建模与控制方法;②掌握低阶线性ADRC的设计原理和实现步骤;③学习如何通过结构不变补偿简化复杂系统的控制设计;④进行系统仿真与实验验证,评估不同控制方法的性能;⑤掌握参数调整与稳定性分析技巧,确保控制系统在实际应用中的可靠性和鲁棒性。 阅读建议:本文内容详尽,涉及多个控制理论和技术细节。读者应首先理解电液伺服系统的基本原理和ADRC的核心思想,然后逐步深入学习SIC补偿、ESO设计、控制律实现等内容。同时,结合提供的代码示例进行实践操作,通过调整参数和运行仿真,加深对理论的理解。对于希望进步探索的读者,可以关注文中提到的高级话题,如频域稳定性分析、参数敏感性分析等,以提升对系统的全面掌控能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值