栈的遗留问题

问题一:括号匹配。

bool  Match(char a[n])
{
   InitStack(S);  //初始化栈
   int i=0;
   while(a[i]!='\0')   //未读到串尾时
   {
     switch(a[i])
     {
       case '(':push(S,a[i]);break;
       case '[':push(S,a[i]);break;
       case '{':push(S,a[i]);break;
       case ')':
            pop(S,e);
            if(e!='(')   return false;
            else break;
       case ']':
           pop(S,e);
            if(e!='[')   return false;
            else break;
        case '}':
            pop(S,e);
            if(e!='{')   return false;
            else break;
          default:   //其它字符情况
             return false;
             break;
          }//switch结束
       i++;   //判断下一个字符
  }//while结束
  if(IsEmpty(S)){
      printf("匹配\n");
      return true;
  }
  else{
      printf("不匹配\n");
      return false;
  }
}

问题二:表达式问题
(1)中缀表达式A+B*(C-D)
(2)后缀表达式ABCD-*+
如何根据中缀表达式求后缀表达式?

当前扫描元素 后缀表达式
A A
+ + A
B + AB
* +* AB
( +*( AB
C +*( ABC
- +*(- ABC
D +*(- ABCD
) ABCD-*+

规则:扫描中缀表达式
①若为字符,则加入后缀表达式;
②若为运算符,则
a:’(’,入栈;
b:’)’,依次将运算符弹出,直至’(’,并删除它;
c:其它:优先级高于栈顶运算符优先级,则入栈,否则依次弹出,直至遇到比它低的运算符或’(’。

如何根据后缀表达式求中缀表达式的值?

当前扫描元素 类型 动作
A 操作数 入栈 A
B 操作数 入栈 A B
C 操作数 入栈 A B C
D 操作数 入栈 A B C D
- 运算符 弹出栈顶两个操作数,计算C-D=R1,R1入栈 A B R1
* 运算符 弹出栈顶两个操作数,计算B*R1=R2,R2入栈 A R2
+ 运算符 弹出栈顶两个操作数,计算A+R2=R3,R3入栈 R3

结果R3=A+B*(C-D)

发布了28 篇原创文章 · 获赞 13 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/pilgrim_121/article/details/88552824
今日推荐