數據結構括弧匹配演算法
Ⅰ 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");