1. 程式人生 > >資料結構:用連結串列實現棧的括號匹配

資料結構:用連結串列實現棧的括號匹配

完成以下程式,並在右邊空白處,對錯誤進行修改,並記錄下程式執行結果:

1. 編寫演算法,判斷一表達式中的括號是否配對,包括大、中、小三類括號。

連結串列版本:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <stack>
#include <string>

using namespace std;


/**棧的鏈式儲存**/
typedef struct Data{
	char c;
};
typedef struct Stack{
	Data data;
	Stack *top;	//指向棧頂元素
};
/**初始化空棧**/
void InitStack(Stack *S){
	S->top = NULL;
}
/**判斷是否為空棧**/
int StackEmpty(Stack S){
	//為空返回1否則返回0
	if(S.top==NULL) return 1;
	else return 0;
}
/**返回棧頂元素**/
void GetTop(Stack S,Data *d){
	if(StackEmpty(S)==1)
		printf("It's an empty stack!");
	else{
		d->c = S.top->data.c;
	}
}
/**向棧頂插入新元素 入棧**/
void PushStack(Stack *S,Data d){
	Stack* p = (Stack *)malloc(sizeof(Stack));
	p->data.c = d.c;
	p->top = S->top;
	S->top = p;
}
/**從棧頂刪除元素 出棧**/
void PopStack(Stack *S,Data *d){
	if(StackEmpty(*S)==1){
		printf("It's an empty stack!\n");
	}else{
		Stack *p = S->top;
		S->top = p->top;
		d->c = p->data.c;
	}
}
/**清空棧**/
void ClearStack(Stack *S){
	if(StackEmpty(*S)==1){
		printf("It's already an empty stack!\n");
	}else{
		S->top = NULL;
	}
}
/**列印棧內資訊**/
void PrintStack(Stack S){
	if(StackEmpty(S)==1){
		printf("It's an empty stack!\n");
	}else{
		printf("name----age\n");
		while(S.top!=NULL){
			printf("%s\n",S.top->data.c);
			S.top = S.top->top;
		}
	}
}
/**檢查右括號與棧頂元素是否匹配**/
int Match(Data r,Data s){
	//匹配成功返回1
	if(r.c==')'&&s.c=='('){
		return 1;
	}else if(r.c=='}'&&s.c=='{'){
		return 1;
	}else if(r.c==']'&&s.c=='['){
		return 1;
	}else{
		return 0;
	}
}
/**括號匹配**/
int CheckMatch(char *m,Stack *S){
	Data r,s;
	while(*m){
		switch (*m){
		case '(':
		case '{':
		case '[':
			s.c = *m;   //賦值 
			PushStack(S,s);  //進棧 
			*m++;   //向後移動 
			break;
		case ')':
		case '}':
		case ']':
			if(StackEmpty(*S)){   //棧空 
				printf("資料中 %s 沒有匹配!\n",*m);
				return 0;
			}
			GetTop(*S,&s);  //獲取棧頂元素 
			r.c = *m;
			if(Match(r,s)){    //匹配判斷 
				PopStack(S,&s);
				*m++;
			}else{
				printf("資料中 %c 沒有匹配項!\n",*m);
				return 0;
			}
		default:
			*m++;
		}
	}
	return 1;
}
int main(){
	char d[100];
	Stack S;   //定義一個S的棧 
	char *p;    //定義一個指標 
	scanf("%s", d); 
	p = d;	//指向表示式
	InitStack(&S);  //初始換棧 
	if(CheckMatch(p,&S))
	{
		printf("匹配成功!\n");
	}    //匹配棧 
	else printf("匹配不成功!"); 
	return 0;
}

C++版本:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <stack>
#include <string>

using namespace std;
typedef long long LL;

char a[100];
int n, m;
stack <char> s;

int main()
{
	scanf("%s", a+1);
	int len = strlen(a + 1);
	int flag = 1;
	int  f = 0;
	cout << "len == " << len << endl;
	while(len)
	{
		len--;
//		cout << "now == " << a[flag] <<  endl;
		if(a[flag] == '{' || a[flag] == '[' || a[flag] == '(')
		{
			s.push(a[flag]);
			flag++;
		}
		else if( flag == 1 && (a[flag] == '}' || a[flag] == ']' || a[flag] == ')'))
		{
			f = 1;
			break;
		}
		else if((a[flag] == '}' && s.top() == '{') || (a[flag] == ']' && s.top() == '[')|| (a[flag] == ')' && s.top() == '(') ){
 				s.pop();
				flag++;
				continue;
			}
		else{
				cout << "a[flag] == " << a[flag] << endl;
				cout << "s.top == " << s.top() << endl;
				f = 1;
				break;
			}
	}
	if(f == 1) cout << "這個括號沒有完全匹配" << endl;
	else cout << "括號已經完全匹配" << endl;
	return 0;	
}