问题:
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即:
分析:
可用栈实现该特性。最后出现的左括号最先被匹配(LIFO),每出现一个右括号,就 “消耗”一个左括号。
依次扫描所有字符,遇到左括号入栈,遇到右括号则弹出栈顶元素检查是否匹配。
匹配失败情况:①左括号单身②右括号单身③左右括号不匹配。
算法流程图:
bool bracketCheck(char str[],int length){
SqStack S;
InitStack(S);
for(int i=0;i
算数表达式由三部分组成:
表达式分为三种:
中缀表达式转后缀:
初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。
从左到右处理各个元素,直到末尾。可能遇到三种情况:
按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式。
用栈实现后缀表达式的计算:
若计算前缀表达式,则应该从右往左扫描,其余与计算后缀表达式相同,注意先出栈的是左操作数。
算符间的优先关系:
OperandType EvaluateExpression(){
SqStack OPTR,OPND;
InitStack (OPTR);//运算符栈
Push(OPTR,'#') ;
InitStack (OPND);//操作数栈
ch=getchar();
while (ch!= '#' || GetTop(OPTR)! = '#') {
if (! In(ch)){
Push(OPND,ch); ch=getchar();
} // ch不是运算符则进栈
else
switch (Precede(GetTop(OPTR),ch)) {//比较优先权
case '<' : //当前字符ch压入OPTR栈,读入下一字符ch
Push(OPTR, ch);
ch = getchar();
break;
case '>' ://弹出OPTR栈顶的运算符运算,并将运算结果入栈
Pop(OPTR, theta);
Pop(OPND, b);
Pop(OPND, a);
Push(OPND,Operate(a, theta, b));
break;
case '=' : //脱括号并接收下一字符
Pop(OPTR,x);
ch = getchar();
break;
} // switch
} // while
return GetTop(OPND);
} // EvaluateExpression
函数调用的特点:最后被调用的函数最先执行结束(LIFO)。
函数调用时,需要用一个栈存储:
递归调用时,函数调用栈可称为“递归工作栈”,每进入一层递归,就将递归调用所需信息压入栈顶;每退出一层递归,就从栈顶弹出相应信息。
缺点:效率低,太多层递归可能会导致栈溢出;可能包含很多重复计算。
问题:假设在舞会上,男士和女士各自排成一队。舞会开始时,依次从男队和女队的对头各出一人配成舞伴。如果两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写以算法模拟上述舞伴配对问题。
分析:显然,先入队的男士或女士先出队配成舞伴。因此该问题具有典型的先进先出特征,可以利用队列作为算法的数据结构。首先构造两个队列依次从队头元素出队配成舞伴某队为空,则另外一对等待着则是一下舞曲第一个可获得舞伴的人。
各数组元素大小相同,且物理上连续存放。
数组元素a[i] 的存放地址 = L O C + i ∗ s i z e o f ( E l e m T y p e ) ( 0 ≤ i < 10 ) = LOC + i * sizeof(ElemType) (0≤i<10) =LOC+i∗sizeof(ElemType)(0≤i<10)
注:除非题目特别说明,否则数组下标默认从0开始 注意审题!
行优先存储:M行N列的二维数组中,则
b{i,j}的存储地址 = L O C + ( i ∗ N + j ) ∗ s i z e o f ( E l e m T y p e ) = LOC + (i*N + j) * sizeof(ElemType) =LOC+(i∗N+j)∗sizeof(ElemType)
列优先存储:M行N列的二维数组中,则
b{i,j}的存储地址 = L O C + ( j ∗ M + i ) ∗ s i z e o f ( E l e m T y p e ) = LOC + ( j*M+ i ) * sizeof(ElemType) =LOC+(j∗M+i)∗sizeof(ElemType)
对于普通矩阵可用二维数组存储,但是某些特殊矩阵可以压缩存储空间。
若 n 阶方阵中任意一个元素 a i , j a_{i,j} ai,j都有 a i , j = a j , i a_{i,j} = a_{j,i} ai,j=aj,i,则该矩阵为对称矩阵。
压缩存储策略:只存储主对角线+下三角区(或主对角线+上三角区)。按行优先原则将各元素存入一维数组中。
从矩阵下标推出一维数组下标,即 a i , j ( i ≥ j ) → B [ k ] a_{i,j}(i \geq j) \rightarrow B[k] ai,j(i≥j)→B[k],则有 k = i ( i − 1 ) 2 + j − 1 k=\frac{i(i-1)}{2}+j-1 k=2i(i−1)+j−1。
出题方法:
下三角矩阵:除了主对角线和下三角区,其余的元素相同
上三角矩阵:除了主对角线和上三角区,其余的元素相同
压缩存储策略:按行优先原则将橙色区元素存入一维数组中。并在最后一个位置存储常量c。
从矩阵下标推出一维数组下标,即 a i , j ( i ≥ j ) → B [ k ] a_{i,j}(i \geq j) \rightarrow B[k] ai,j(i≥j)→B[k],则有
下三角矩阵KaTeX parse error: Undefined control sequence: \mbox at position 56: …-1)}{2}+j-1 & \̲m̲b̲o̲x̲{for} & i \leq…
上三角矩阵KaTeX parse error: Undefined control sequence: \mbox at position 65: …)}{2}+(j-i) & \̲m̲b̲o̲x̲{for} & i \leq…
压缩存储策略:按行优先(或列优先)原则,只存储带状部分
从矩阵下标推出一维数组下标,即 a i , j ( i ≥ j ) → B [ k ] a_{i,j}(i \geq j) \rightarrow B[k] ai,j(i≥j)→B[k],则有 k = 2 i + j − 3 k=2i+j-3 k=2i+j−3
若已知数组下标k如何得到i,j?
分析:前i-1行共 3(i-1)-1 个元素,前i行共 3i-1 个元素,显然, 3(i-1)-1 < k+1 ≤ 3i-1
压缩存储策略: