数据结构括号匹配算法
Ⅰ C语言数据结构判断小括号是否匹配的算法,这两个空填什么
if (count < 0) break;
count != 0
理解了算法就简单了,如果遇到左括号就加一,遇到右括号减一,也就是是正常的话,左括号一定大于等于右括号,也就是说不可能出现负数,
最后成功推出的时候,左括号的个数个右括号的个数一定相等,于是count应该等于零。
Ⅱ 数据结构(C) 请用类C语言实现括号匹配的检验这个算法
int compare(sqstack &s,FILE *fp)
{
char ch; fp=fopen("a.txt","r");
ch=fgetc(fp);
if(ch==')'||ch==']'||ch=='}')
return(0);
while(ch!=EOF)
{
switch(ch)
{
case'(':push(s,ch);break;
case'[':push(s,ch);break;
case'{':push(s,ch);break;
case')':
s.top--;
if(*s.top=='(')
break;
else {fclose(fp);return(0);}
case']':
s.top--;
if(*s.top=='[')
break;
else {fclose(fp);return(0);}
case'}':
s.top--;
if(*s.top=='{')
break;
else {fclose(fp);return(0);}
}
ch=fgetc(fp);
}
if(s.top==s.base) return(1);
else {fclose(fp);return(0);}
}
我这可能麻烦一些。。。
Ⅲ 数据结构 括号匹配算法
楼上说的是一个原因,不过去掉!StackEmpty(S)后问题依旧。
你的原因主要是这里:
case ')':{Pop(S,e);
if(e!='(') flag=1; break;}
应该先判断,再出栈。不能先出栈再判断。
Ⅳ 急!!!!数据结构,括号匹配问题
我这有一道以前做的题,目的是一样的,可能实现方法有些不同,你看下吧,看看哪些适合你的题目就用吧
//每次输入一个扩号进行匹配
#include <iostream.h>
template <class T> class stack
{
private:
T st[100][2];
int sign;
public:
stack(int n=100) { sign=0; }
T pop()
{
T temp=st[sign-1][0];
sign--;
return temp;
}
T & top() { return st[0][0]; }
void push (const T & x)
{
st[sign][0]=x;
sign++;
}
bool empty()
{
if(sign==0)
return true;
else
return false;
}
bool Judge(T x)
{
for(int i=sign-1;i>=0;i--)
{
if((st[i][0]==int(x)-1 || st[i][0]==int(x)-2) && st[i][1]!=0)
{
cout<<"匹配"<<i+1<<endl;
st[i][1]=0;
return true;
}
}
cout<<"不匹配"<<endl;
return false;
}
};
void main()
{
stack<int> ss;
char exit=1;
while(exit!='0')
{
cin>>exit;
if(exit=='(' || exit=='[' || exit=='{')
{
ss.push(exit);
}
else
if(exit==')' || exit==']' || exit=='}')
{
ss.push(exit);
if(!ss.Judge(exit))
{
break;
}
}
else if(exit!='0')
{
cout<<"输入错误"<<endl;
}
}
}
Ⅳ 求多项式中括号匹配算法~~(有关数据结构,C++实现)
括号可以用栈来匹配啊, 数据结构中的运算符优先法就是用栈实现的,
左右括号都是运算符,规定(优先级最底,要入栈到运算符栈, 其他运算符优先都要高于( 但低于),其他运算符之间的优先关系暂且忽略不说,也就是当读取到) 的时候, 括号内运算一定会结束并得出一个结果进入到操作数栈(由于 ) 的优先级比其他所有运算符都高,其他运算符要出栈运算,并且把结果入到操作数栈),然后就是检查操作数栈栈顶是否是左括号,如果是在左括号出栈,这样左右括号就一起消掉,如果不是,则报错,你要检查你的运算符优先表的定义,因为根据定义,到读取到右括号的时候,括号内的运算会结束并得出结果, 空括号不影响计算, 只是没有操作数入栈而已,而且可以嵌套括号 , 规定好了优先级,可以实现多种不同优先级的括号的混合运算
Ⅵ 数据结构括号匹配的思想
匹配思想:从左至右扫描一个字符串(或表达式),则每个右括号将与最近遇到的那个左括号相匹配。则可以在从左至右扫描过程中把所遇到的左括号存放到堆栈中。每当遇到一个右括号时,就将它与栈顶的左括号(如果存在)相匹配,同时从栈顶删除该左括号。
算法思想:设置一个栈,当读到左括号时,左括号进栈。当读到右括号时,则从栈中弹出一个元素,与读到的左括号进行匹配,若匹配成功,继续读入;否则匹配失败,返回FLASE。
Ⅶ 数据结构括号匹配的算法问题
return0 就是不匹配,return 1 就是匹配,最后判断栈是不是空的,栈如果是空的,说明匹配了,返回 1 ,如果不是空的,说明还有左括号,匹配失败
Ⅷ 数据结构 VC++6.0环境 判断 括号 匹配问题
1、数据结构 栈,2、算法char* ch 指向 算术表过式//扫描表达式while(ch!='\0'){ if(ch == 左符号) 进栈; else// 右符号 if(stack.top()==对应左符号) 弹出 else return 不配对ch++;} // 表述式扫描完if(栈空) return 配对else return 不配对2、#define MAXBUFF 200char* buff = malloc(MAXBUFF);FILE* stream = fopen("input.txt"); do{ fread(buff, sizeof(char), sizeof(buff), stream); 将buff 传给算法2. 将结果 fwrite 到output.txt;如果不匹配,break}while(feof(stream))free(buff);
Ⅸ 数据结构:括号匹配问题。
include "seqstack1.h"
include "stdio.h"
void BracketMatch(char str);
void BracketMatch(char str) /*str[]中为输入的字符串,利用堆栈技术来检查该字符串中的括号是否匹配
Ⅹ 数据结构之括号匹配(C++,链栈方式实现)
数据结构实验报告 括号匹配
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
//定义顺序堆栈
#define STACK_SIZE 100 //存储空间初始分配量
#define STACK_INC 10 //存储空间分配增量
typedef char Elem;
typedef struct{
Elem *base; //栈底指针
Elem *top; //栈顶指针
int size; //当前已分配的存储空间
}SqStack;
typedef int Status;
//创建空堆栈,栈顶指针和栈底指针相等时,栈为空
Status CreatStack(SqStack &S){
S.base=(Elem *)malloc(STACK_SIZE*sizeof(Elem));
S.top=S.base;
S.size=STACK_SIZE;
return OK;
}
//堆栈是否为空
Status StackEmpty(SqStack S){
if(S.top!=S.base) return ERROR;
return OK;
}
//进栈
Status Push(SqStack &S,Elem e){
if(S.top-S.base>=S.size){ //栈满,追加存储空间
S.base=(Elem *)realloc(S.base,(S.size+STACK_INC)*sizeof(Elem));
S.top=S.base+S.size;
S.size+=STACK_INC;
}
*S.top=e;
S.top+=1;
return OK;
}
//出栈
Status Pop(SqStack &S,Elem &e){
if(S.top==S.base) return ERROR;
S.top-=1;
e=*S.top;
return OK;
}
//括号匹配
Status Bracket(SqStack &S,char *str){
int i=0,flag1=0,flag2;
Elem e;
while(str[i]!='\0'){
switch(str[i]){
case '(':Push(S,'(');break; //'('进栈
case '[':Push(S,'[');break; //'['进栈
case ')':{Pop(S,e);
if(e!='(') flag1=1; break;} //出栈,判断是否为'('
case ']':{Pop(S,e);
if(e!='[') flag1=1;break;} //出栈,判断是否为'['
default: break;
}
if(flag1) break; //出现不匹配,立即结束循环
i++;
}
flag2=StackEmpty(S); //flag2判断堆栈是否为空
if(!flag1 && flag2) printf("括号匹配!\n");
else printf("括号不匹配!\n");
return OK;
}
//主函数
void main()
{
char temp,flag='y';
while(flag=='y'){
char str[255];
SqStack S;
printf("请输入字符串:");
scanf("%s",str);
scanf("%c",&temp); //接受输入的回车键
CreatStack(S);
Bracket(S,str);
printf("你想再试一次吗(按y继续): ");
scanf("%c",&flag);
printf("\n");
}
printf("程序结束.\n");