收录日期:2019/08/19 20:48:47 时间: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;
}

正在沉痛悼念我的贴子中... 菜鸟问题:基于document/view的project,运行弹出来的窗口,最最上面的一行的文字内容如何修改~? 正在非常沉痛悼念我的贴子中... 弱弱的问:怎样在BCB中调用MFC 菜鸟系列:两个笨问题 .net高手请进(和iframe内框架相关问题) 请问谁有选时间的控件?急用。100分送上。 关于jsp的运行环境的问题? Excel文件导入Access中遇到的重大问题:Excel文件中有一列为“检查时间”....跪求各路神仙 当计算数量大时不出结果,出现0x004011ab\"指令引用的“0x068006bc”内存。该内存不能为\"written\"。各位大侠看看怎么回事 初学自定义控件,发现运行比较慢,求助!! 难题!! 看谁能想出好办法来。 有人知道今年上半年的软件设计师证书是从什么时候开始发的? 如何彻底删除一个监听程序?一般的删除都不彻底阿 考研or工作? 为什么不分页显示有数据,一分页就啥数据都没有了? 请教一个关于update的问题 如何控制dbgrid的一列只能输入规定数值啊 急,急,急,为什么总是下载为空的文件???在线等。。。。 想在自己添加的类里面使用application,session,response之类的要怎样做? 关于指针的一点问题 云inging!高手没见到过的错误!在线等,给分inging! 关于表单指定条件颜色显示问题(js) 还是老问题,请看有办法解决没? 【讨论】怎么读取存储在数据库中图片(二进制)的后缀,非图片路径存储???来者有分!!! 刚做的留言版,希望大家给点意见。进来有分 [有没有办法可以使ListView达到TreeCtrl的效果?]内有图示。。请高手解决!!! mm请教各位???谢 请问在哪个地方可以找到 cp 这个命令的源码? 怎样把应用程序最小化为右下角的图标,而不在任务条上面