else if(str[i]=='+'||str[i]=='-') /* 如果判定为"+"号或"-"号,则做如下操作 */ { while((S.top!=S.base)&&(*(S.top-1)!='(')) /* 将S中左括弧"("以前字符依次弹出并存入数组exp 中 */ { Pop(S,ch); exp[j]=ch; j++; } Push(S,str[i]); } 代码思路
时间: 2024-04-26 10:26:51 浏览: 101
这段代码也是中缀表达式转换为后缀表达式的代码片段,主要思路是同样利用栈来实现。当遍历到一个加号或减号时,如果栈顶元素不是左括号,则将栈顶元素弹出并加入后缀表达式中,直到栈顶元素为左括号或栈为空。最后将加号或减号入栈。需要注意的是,左括号不能被弹出并加入后缀表达式中,因为左括号只是用来表示优先级的,不参与计算。
相关问题
else if (str[i] == '<' || str[i] == '>') { while((S.top!=S.base)&&(*(S.top-2)!='(')) { Pop(S, ch); exp[j] = ch; j++; } Push(S, str[i]); } else if(str[i]=='+'||str[i]=='-') /* 如果判定为"+"号或"-"号,则做如下操作 */ { while((*(S.top-2)=='+')||(*(S.top-2)=='-')) /* 将S中左括弧"("以前字符依次弹出并存入数组exp 中 */ { Pop(S,ch); exp[j]=ch; j++; } Push(S,str[i]); } /* end of else if */ else if (str[i]=='*'||str[i]=='/') { while((*(S.top-1)=='*')||(*(S.top-1)=='/')) { Pop(S,ch); exp[j]=ch; j++; } Push(S,str[i]); } 请改善代码使优先级正确执行》
为了使表达式的优先级正确执行,需要对代码进行修改。
可以使用一个运算符优先级数组,将运算符的优先级与其对应的下标相对应,然后在遍历表达式时,将遇到的运算符与栈顶运算符的优先级进行比较,如果栈顶运算符的优先级高于或等于当前运算符,就将栈顶运算符弹出并加入到表达式中,直到栈顶运算符的优先级低于当前运算符,再将当前运算符入栈。
下面是修改后的代码:
```c++
int priority(char c) {
if (c == '(') return 0;
if (c == '+' || c == '-') return 1;
if (c == '*' || c == '/') return 2;
if (c == '<' || c == '>') return 3;
return -1;
}
void infix2suffix(char* str, char* exp) {
SqStack S;
InitStack(S);
int j = 0;
for (int i = 0; str[i] != '\0'; i++) {
char ch = str[i];
if (ch >= '0' && ch <= '9') {
exp[j] = ch;
j++;
} else if (ch == '(') {
Push(S, ch);
} else if (ch == ')') {
while (S.top != S.base && *(S.top - 1) != '(') {
Pop(S, ch);
exp[j] = ch;
j++;
}
if (S.top != S.base) Pop(S, ch);
} else if (ch == '+' || ch == '-') {
while (S.top != S.base && priority(ch) <= priority(*(S.top - 1))) {
Pop(S, ch);
exp[j] = ch;
j++;
}
Push(S, ch);
} else if (ch == '*' || ch == '/' || ch == '<' || ch == '>') {
while (S.top != S.base && priority(ch) <= priority(*(S.top - 1))) {
Pop(S, ch);
exp[j] = ch;
j++;
}
Push(S, ch);
}
}
while (S.top != S.base) {
Pop(S, ch);
exp[j] = ch;
j++;
}
exp[j] = '\0';
}
```
在上述代码中,我们定义了一个 `priority` 函数,用于返回运算符的优先级。然后在处理不同运算符时,根据优先级决定是否将栈顶元素弹出,以保证表达式的优先级正确执行。
function [Solution_matrix]=GaussElimination_Pivot(Augmented_matrix) % 2020-5-18 臻orz % inputs: % Augmented_matrix:增广矩阵,为n*(n+1)维矩阵 % outputs: % Solution_matrix:计算的解,为n1维矩阵 %initialize [row,col]=size(Augmented_matrix); Solution_matrix=zeros(row,1); %判定输入矩阵是否符合要求 if row~=col-1 disp('请输入n(n+1)维矩阵'); else for ii = 1:row-1 %找寻主元 max = ii; for jj = ii+1:row if abs(Augmented_matrix(jj,ii)) > abs(Augmented_matrix(max,ii)) max = jj; end end Augmented_matrix([ii,max],:) = Augmented_matrix([max,ii],:); if Augmented_matrix(ii,ii) == 0 disp(['第',num2str(ii),'个主元素为零']); return; end %开始消元 for jj = ii+1:row Augmented_matrix(jj,:) = Augmented_matrix(jj,:)-... Augmented_matrix(jj,ii)/Augmented_matrix(ii,ii)*Augmented_matrix(ii,:); end end %消元完毕,开始回代 if Augmented_matrix(row,row)==0 disp(['第',num2str(row),'个主元素为零']); return; end Solution_matrix(row)=Augmented_matrix(row,col)/Augmented_matrix(row,col-1); for ii=row-1:-1:1 Solution_matrix(ii)=(Augmented_matrix(ii,col)... -Augmented_matrix(ii,1:row)*Solution_matrix)/Augmented_matrix(ii,ii); end end end请问如何使用这个matlab函数,能否举一个例子
这个函数是用来解线性方程组的,输入的增广矩阵是由系数矩阵和常数列构成的。下面是一个例子:
假设有如下线性方程组:
2x + 3y - z = 1
4x - 2y + 3z = -2
-2x + 5y + 2z = 6
则可以将系数矩阵和常数列组成增广矩阵:
Augmented_matrix = [2 3 -1 1; 4 -2 3 -2; -2 5 2 6];
然后调用函数:
Solution_matrix = GaussElimination_Pivot(Augmented_matrix);
最终得到的 Solution_matrix 就是解向量,即 x、y、z 的值。