一. 括号匹配
bool bracketCheck(char str[], int length)
{
SqStack S;
InitStack(S); //初始化一个栈
for(int i=0; i<length; i++)
{
if(str[i]=='(' || str[i]=='[' || str[i]=='{')
{
Push(S, str[i]); //扫描到左括号,入栈
}else{
if(StackEmpty(S)) //扫描到右括号,且当前栈空
return false; //匹配失败
char topElem;
Pop(S, topElem); //栈顶元素出栈
if(str[i]==')' && topElem!='(')
return false;
if(str[i]==']' && topElem!='[')
return false;
if(str[i]=='}' && topElem!='{')
return false;
}
}
return StackEmpty(S); //检索完成全部括号后,栈空说明匹配成功
}
***********************考试中可直接使用基本操作,建议简要说明接口**************************
//初始化栈
void InitStack(SqStack &S)
//判断栈是否为空
bool StackEmpty(SqStack S)
//新元素入栈
bool Push(SqStack &S, char x)
//栈顶元素出栈,用x返回
bool Pop(SqStack &S, char &x)
二. 采用递归算法解决的问题
所谓递归是指,若在一个函数、过程或者数据结构定义的内部又直接(或间接)出现定义本身的应用,则称他们是递归的。
以下三种情况常使用递归的方法
2.1 定义是递归的
二阶Fibnacci数列定义:
long Fib(long n)
{
if (n==1||n==2) return 1; //递归终止的条件
else return Fib(n-1) + Fib(n-2); //递归步骤
}
对于类似这种的复杂问题,若能够分解成几个相对简单且解法相同或类似的子问题来求解,便称作递归求解,这种分解—求解策略叫做“分治法”。采取分治法进行递归求解的问题需要满足以下三个条件:
1、能将一个问题变成一个新问题,新问题解法相同或类似,处理对象更小且变化有规律‘
2、转化使问题简单;
3、必须有一个明确的递归出口(或称递归边界)。
2.2 数据结构是递归的
遍历输出链表中各个结点的递归算法
void TraverseList(LinkList p)
{
if(p==NULL) return;
else
{
cout<<p->data<<endl;
TraverseList(p->next);
}
}
2.3 问题的解法是递归的
Hanoi塔问题的递归算法
void Hanoi(int n, char A, char B, char C)
{ //将塔座A上的n个圆盘按规则搬到C上,B做辅助塔
if(n==1) move(A,1,C); //将编号为1的圆盘从A移到C
else
{
Hanoi(n-1,A,C,B); //将A上编号为1至n-1的圆盘从A移到C
move(A,n,C); //将编号为n的圆盘从A移到C
Hanoi(n-1,B,A,C); //将B上编号为1至n-1的圆盘移到C,A做辅助塔
}
}
三. 表达式求值
算数表达式由三个部分组成 :操作数、运算符、界限符。
3.1 中缀转后缀
左优先原则:只要左边的运算符能先计算,就先算左边的。
3.2 中缀转前缀