如何利用链栈实现括号匹配算法
#include
#define MAX 100
typedef struct{
int row,col;
int val;
}TriNode;
typedef struct{
TriNode data[MAX];
int m,n,t;
}TriTable;
void CreateTri(TriTable *p) /*该函数为建立三元组,要求按行优先顺序输入*/
{ int i;
scanf("%d,%d,%d",&p->m,&p->n,&p->t);
printf("Please input the information of row,queue and element:\n");
for (i=1;it;i++)
scanf("\t\t%d,%d,%d",&p->data[i].row,&p->data[i].col,&p->data[i].val);
}
void OutputTri(TriTable *p) /*该函数将输出指定三元组内容*/
{ int i;
printf("\n");
printf("According the row first input the data:\n");
for (i=1;it;i++)
printf("%d ,%d ,%d \n",p->data[i].row,p->data[i].col,p->data[i].val);
}
void Output(TriTable *p) /*该函数将输出矩阵pa+pb的结果*/
{ int i;
printf("\n");
printf("The sum of pa and pb:\n");
for (i=1;it;i++)
printf("%d ,%d ,%d \n",p->data[i].row,p->data[i].col,p->data[i].val);
}
void AddTri(TriTable *pa,TriTable *pb,TriTable *pc) /*该函数是将pa,pb所指三元组求和后保存在新三元组PC中*/
{ int i,j,k;
i=j=k=1;
while( pa->t-i>=0 && pb->t-j>=0)
if(pa->data[i].row==pb->data[j].row){ /*当pa与pb当前元素的行号相等*/
if(pa->data[i].col==pb->data[j].col){ /*当pa与pb当前元素的列号相等*/
if ((pa->data[i].val+pb->data[j].val)!=0){
pc->data[k].row=pa->data[i].row;
pc->data[k].col=pa->data[i].col;
pc->data[k].val=pa->data[i].val+pb->data[j].val; /*元素值相加*/
k++;i++;j++;
}
else{
i++;j++;
}
}
else{
if (pa->data[i].coldata[j].col) /*当pa与pb当前元素的列号不等*/
{
pc->data[k].row=pa->data[i].row;
pc->data[k].col=pa->data[i].col;
pc->data[k].val=pa->data[i].val;
k++;i++;
}
else{
pc->data[k].row=pb->data[j].row;
pc->data[k].col=pb->data[j].col;
pc->data[k].val=pb->data[j].val;
k++;j++;
}
}
}
else{
if(pa->data[i].rowdata[j].row) /*当pa与pb当前元素的行号不等*/
{
pc->data[k].row=pa->data[i].row;
pc->data[k].col=pa->data[i].col;
pc->data[k].val=pa->data[i].val;
k++;i++;
}
else
{
pc->data[k].row=pb->data[j].row;
pc->data[k].col=pb->data[j].col;
pc->data[k].val=pb->data[j].val;
k++;j++;
}
}
if (pa->t-i>=0)
for (;it;i++){
pc->data[k].row=pa->data[i].row;
pc->data[k].col=pa->data[i].col;
pc->data[k].val=pa->data[i].val;
k++;
}
if (pb->t-j>=0)
for (;jt;j++){
pc->data[k].row=pb->data[j].row;
pc->data[k].col=pb->data[j].col;
pc->data[k].val=pb->data[j].val;
k++;
}
pc->m=pa->m;/*复制结果矩阵的总行数*/
pc->n=pa->n;
pc->t=k-1;/*得到结果矩阵中非0元素的总个数.*/
}
main(){
TriTable *ma,*mb,*mc;
ma=(TriTable*)malloc(sizeof(TriTable));
mb=(TriTable*)malloc(sizeof(TriTable));
mc=(TriTable*)malloc(sizeof(TriTable));
printf("\n\tHow mang row,col,val do you input Matrix A:\n\t\t");
CreateTri(ma);
OutputTri(ma);
printf("\n\tHow mang row,col,val do you input Matrix B:\n\t\t");
CreateTri(mb);
OutputTri(mb);
AddTri(ma,mb,mc);
Output(mc);
getch();
}
Python正则表达式中括号的作用
示例:
1、(abc|bcd|cde),表示这一段是abc、bcd、cde三者之一均可,顺序也必须一致
2、(abc)?,表示这一组要么一起出现,要么不出现,出现则按此组内的顺序出现
3、(?:abc)表示找到这样abc这样一组,但不记录,不保存到$变量中,否则可以通过$x取第几个括号所匹配到的项,比如:(aaa)(bbb)(ccc)(?:ddd)(eee),可以用$1获取(aaa)匹配到的内容,而$3则获取到了(ccc)匹配到的内容,而$4则获取的是由(eee)匹配到的内容,因为前一对括号没有保存变量
方括号是单个匹配,示例:
1、[0-3],表示找到这一个位置上的字符只能是0到3这四个数字,与(abc|bcd|cde)的作用比较类似,但圆括号可以匹配多个连续的字符,而一对方括号只能匹配单个字符!
用栈实现括号匹配的检验
#include
#include
#define MAX_STACK 100
struct stStack
{
char szStack[MAX_STACK];
int nTop;
};
void InitStack(stStack& s)
{
s.nTop = -1;
}
char Push(stStack& s, char c)
{
if (s.nTop == MAX_STACK - 1)
return 0;
s.nTop ++;
s.szStack[s.nTop] = c;
return c;
}
char Pop(stStack& s)
{
if (s.nTop == -1)
return 0;
char c = s.szStack[s.nTop];
s.nTop--;
return c;
}
int Check(char* szText)
{
stStack s;
InitStack(s);
int nLen = strlen(szText);
for (int i = 0; i < nLen; i++)
{
char c = szText[i];
switch (c)
{
case '(':
case '{':
case '[':
Push(s, c);
break;
case ')':
if (Pop(s) != '(')
return 0;
break;
case '}':
if (Pop(s) != '{')
return 0;
break;
case ']':
if (Pop(s) != '[')
return 0;
break;
}
}
return 1;
}
int main()
{
char szText[100];
scanf("%s", szText);
if (Check(szText))
{
printf("合法\n");
}
else
{
printf("失败\n");
}
return 0;
}
如何用正则表达式匹配括号中的内容,不包含括号
“()” 等这些在正则表达式中有特殊意义的字符,要当普通字符使用时,在其前面加'\'即可。正则表达式中的圆括号的作用:正则表达式中的圆括号的作用是对字符进行分组,并保存匹配的文本。圆括号用法I:对字符或元字符进行分组,这样在圆括号内就可以对字符组合使用限定符。eg. 匹配A+一个数字+A+一个数字:(A\d){2}圆括号用法II:表示可选择性。3.1 从两个直接量中选择一个。eg. gr(a|e)y匹配gray和grey,该例子还可以使用gr[ae]y,字符类效率更高。3.2 从多个直接量中选择。eg. (Doctor|Dr\.?)匹配Doctor,Dr,Dr.三种情况。3.3 错误匹配的交替行为。使用交替行为时,有时会出现意想不到的错误。eg. 用(a|ab)匹配ab时,只能匹配a,但是如果用(ab|a),则可以匹配ab。反向引用(backreferences)。语法:.NET和JavaScript中,表示匹配第一组的变量被指定为”\1”。能够体现反向引用的便利性的一种情况是找到句子中重复的单词。eg. 查找下列句子中重复的单词:I think that that is often overdone.This sentence contains contains a doubled word or two two.