收录日期:2019/04/24 20:30:55 时间:2016/05/30 10:06:28 标签:C语言
谁有《数据结构》(严蔚敏,吴伟民编)上,在栈的应用举例那一节“括号匹配的检验”的代码啊!

先谢谢了。^_^
3.18 
Status Bracket_Test(char *str)//判别表达式中小括号是否匹配
{
 count=0;
 for(p=str;*p;p++)
 {
   if(*p=='(') count++;
   else if(*p==')') count--;
   if (count<0) return ERROR;
 }
 if(count) return ERROR; //注意括号不匹配的两种情况
 return OK;
}//Bracket_Test 

3.19 
Status AllBrackets_Test(char *str)//判别表达式中三种括号是否匹配
{
 InitStack(s);
 for(p=str;*p;p++)
 {
   if(*p=='('||*p=='['||*p=='{') push(s,*p);
   else if(*p==')'||*p==']'||*p=='}')
   {
     if(StackEmpty(s)) return ERROR;
     pop(s,c);
     if(*p==')'&&c!='(') return ERROR;
     if(*p==']'&&c!='[') return ERROR;
     if(*p=='}'&&c!='{') return ERROR; //必须与当前栈顶括号匹配
   }
 }//for
 if(!StackEmpty(s)) return ERROR;
 return OK;
}//AllBrackets_Test 

具体请看:http://bbs.21ky.net/kaoyan/cgi-bin/topic.cgi?forum=75&topic=282&start=0&show=0
/*
 * valuate a expresssion,for instance 5+4*(6+3/2);
 *notice:  can't input the numreal great 10;
 */
#include<iostream>
#include<string>
#include<map>
#include<set>
#include<stack>

#include<stdlib.h>

#pragma warning (disable: 4786)

std::map<char,int> prec_map;

template<class key,class value>
void Init_Map(std::map<key,value> &map1)
{
   prec_map['+'] = 0;
   prec_map['-'] = 1;
   prec_map['*'] = 2;
   prec_map['/'] = 3;
   prec_map['('] = 4;
   prec_map[')'] = 5;
   prec_map['#'] = 6;
   return;
}
const char prec_table[7][7] ={{'>','>','<','<','<','>','>'},
                              {'>','>','<','<','<','>','>'},
                              {'>','>','>','>','<','>','>'},
                              {'>','>','>','>','<','>','>'},
                              {'<','<','<','<','<','=',' '},
                              {'>','>','>','>',' ','>','>'},
                              {'<','<','<','<','<',' ','='}}; 
                                                      //space is wrong!
char Precede(char optr1,char optr2)
{
   int row = prec_map[optr1];
   int col = prec_map[optr2];
   return prec_table[row][col];
}
int Operate(int a,char theta,int b)
{
   if (theta == '+')
      return a+b;
   if (theta == '-')
      return a-b;
   if (theta == '*')
      return a*b;
   if (theta == '/')
      return a/b;
}
int EvaluateExpression(std::string exp)
{
   exp.append("#");
   int size = exp.size();
   char theta;           //operator
   int a,b;               //operand a and b;
   std::stack<int>   opnd_stack;
   std::stack<char>  optr_stack;
   optr_stack.push('#');
   for (int i = 0; i < size; i++)
   {
      char ch = exp[i];
      if ((ch <= '9') && (ch >= '0'))   // is digital
      {
            opnd_stack.push(atoi(&ch));
      }
      else
      {
            switch(Precede(optr_stack.top(),ch))
            {
             case '<':
                optr_stack.push(ch);
                break;
             case '=':
                optr_stack.pop();
                break;                
             case '>':
                theta = optr_stack.top();
                optr_stack.pop();
                b = opnd_stack.top();
                opnd_stack.pop();
                a = opnd_stack.top();
                opnd_stack.pop();
                opnd_stack.push(Operate(a,theta,b));
--i;
                break;
             default:
                std::cerr<<"The expression:"<<exp<<"has syntak wrong!\n";
                exit(-1);
                break;
            }//switch
      }//if
   } //for
      return opnd_stack.top();
}

      
int main()
{
   std::string exp;
   Init_Map(prec_map);
   std::cout<<"Input you expression:";
   std::cin>>exp;
   std::cout<<std::endl<<"The expression "<<exp<<"result is:"
            <<EvaluateExpression(exp);   
   
   system("pause");

return 0;
}
以前写的,也许对你有点用哈
记号
请问楼上,“记号”是何意啊??!~~~~~~
请问cxc014(zerostr)
#pragma warning (disable: 4786)

std::map<char,int> prec_map;

template<class key,class value>

这三行是什么意思啊?不懂啊!偶比较CAI.嘻嘻^_^
还请明言啊,完了定当加分。
#pragma warning (disable: 4786)
//让警告4786无效

std::map<char,int> prec_map;
//声明一个map

template<class key,class value>
void Init_Map(std::map<key,value> &map1)
//定义一个函数模版
都是高手啊!~~~~~~小弟现在C++还没怎么学。
/*假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,
编写一个算法判断其中的括号是否匹配。
解:本题使用一个运算符栈st,当遇到的'('、'['和'{'时进栈,当遇到
'}'、']'或')'时判断栈顶是否为相应的括号,若是退栈继续执行;否则算
法结束。*/
#include <iostream.h>
#include <malloc.h>
#define MaxLen 20 //顺序栈存放的最多元素个数为MaxLen-1
typedef char elemtype;
typedef struct sqstack
{
elemtype data[MaxLen];
int top;
}stack;
void init(stack *st) //初始化栈st
{
st->top=0;
}
int push(stack *st,elemtype x) //入栈
{
if(st->top==MaxLen-1)
{
cout<<"栈上溢出!"<<endl;
return 0;
}
else
{
st->top++;
st->data[st->top]=x;
return 1;
}
}
int pop(stack *st,elemtype *x) //退栈
{
if(st->top==0)
{
cout<<"栈下溢出!"<<endl;
return 0;
}
else
{
*x=st->data[st->top];
st->top--;
return 1;
}
}
int empty(stack *st) //判断栈是否为空栈
{
if(st->top==0)
return 1;
else
return 0;
}
int correct(char *str)
{
stack st;
char x;
int i,ok=1;
init(&st);
for(i=0;str[i]!='\0';i++)
{
switch(str[i])
{
case '(': push(&st,'('); break;
case '[': push(&st,'['); break;
case '{': push(&st,'{'); break;
case ')': if(!(pop(&st,&x)&&x=='('))
ok=0; break;
case ']': if(!(pop(&st,&x)&&x==']'))
ok=0; break;
case '}': if(!(pop(&st,&x)&&x=='}'))
ok=0; break;
}
if(!ok) break;
}
if(empty(&st)&&ok)
return 1;
else
return 0;
}
void main()
{
char *str;
str=(char *)malloc(100*sizeof(char));
cout<<"str:";
cin>>str;
if(correct(str))
cout<<"表达式括号匹配。"<<endl;
else
cout<<"表达式括号不匹配。"<<endl;
}

php乱码的问题,但google.cn不乱码,奇怪,急在线等待解决方案 我是新手 如何编程控制其他程序(VC) WinCE LCD 驱动VBPD、VFPD等参数的计算 CreateProcess 不能用默认程序打开文件 而ShellExecute却可以,怎么解决? 使用LkJSON单元解析的问题 优化CUFFT程序的问题,请高人指点 Filter过滤access的中文字符串问题 数据仓库中的“实体”从哪里来?是从维度表中获取的吗? GridView的多个编辑按钮的问题? 关于继承的一点小问题。 oracle数据库变慢,是否可以通过重建索引变快? 缺少对象的问题 C#文章里字符串截取【所有】相同字符串的10位?求高手算法和思路. Windows下用什么“SVN服务器”? cs 页如何使用session 经典100句 如何为sitemap.xml写对应的xsl文件 finditer返回的结果无法span(),原因无法探知,还请牛人指点... 处理分页的问题 求WebBrowser显示网页如何放入线程 请教一条查询语句 ASCII转换问题? 我在看一个参考资料的时候,在介绍什么时候使用泛型方法时,有这样一句: VC.net 2003使用类向导为菜单生成函数不正确的问题 使用VB将EXCEL文件转为DBF文件时遇到的问题? 关于键盘输入字符中断问题~ FACKEDITOR在GB2312下乱码 ext.FormPanel.load 为什么总是failure vb程序怎么和打卡器或者摄像头连接呢?