/*課后習題1.8-h
h. 假設運算式中允許包含3中括號:圓括號、方括號和大括號。
設計一個演算法采用順序堆疊判斷運算式中的括號是否正確配對。
void Bracketmatch(const char* c)
*/
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
class stack {
private:
int maxsize;
int top;
char* st;
public:
stack(int size)
{
maxsize = size;
top = -1;
st = new char[maxsize];
}
void push(char item)
{
st[++top] = item;
}
char top1()
{
return st[top];
}
void pop()
{
top--;
}
bool empty()
{
return top == -1;
}
};
/*
TODO:計一個演算法采用順序堆疊判斷運算式c中的括號是否正確配對。
輸出:1. 遍歷運算式c程序中,匹配錯誤 cout << c[i] << " 匹配錯誤" << endl;
2. 遍歷之后,堆疊為空,則匹配正確,cout << "匹配正確!" << endl;
若不為空,則 cout << s1.top1() << " 匹配錯誤" << endl;
*/
void Bracketmatch(const char* c) //括號匹配
{
bool bj=true;
char t;
stack s1(strlen(c)+1);
for (unsigned int i = 0; i < strlen(c); i++)
{
t = c[i];
switch (t)
{
case '(':
s1.push(t);
break;
case '[':
s1.push(t);
break;
case '{':
s1.push(t);
break;
case ')':
if (s1.top1() == '(')
{
s1.pop();
break;
}
else
{
cout << c[i] << " 匹配錯誤" << endl;
bj = false;
break;
}
case ']':
if (s1.top1() == '[')
{
s1.pop();
break;
}
else
{
cout << c[1] << " 匹配錯誤" << endl;
bj = false;
break;
}
case '}':
if (s1.top1() == '{')
{
s1.pop();
break;
}
else
{
cout << c[i] << " 匹配錯誤" << endl;
bj = false;
break;
}
default:
break;
}
}
if (bj)
{
if (s1.empty())
{
cout << "匹配正確!" << endl;
}
else
cout << s1.top1() << " 匹配錯誤" << endl;
}
}
int main()
{
string s;
getline(cin, s);
Bracketmatch(s.c_str());
return 0;
}
運行結果不對
這個要求寫那個匹配函式,其他地方應該是不讓改的
這里是幾個用例
用例1:
假設輸入為:
{1*[3*2+(2-1)]}
則輸出為:
匹配正確!
用例2:
假設輸入為:
{}{[]()()()()[]{{{}}}
則輸出為:
{ 匹配錯誤
用例3:
假設輸入為:
{1*[3*2+(2-1)}]
則輸出為:
} 匹配錯誤
用例4:
假設輸入為:
(1*(3-(3*[3%[4=[t }5}7-}i9]73]24]5-)6)+)6*)5%{6*{3^{2!!(
則輸出為:
} 匹配錯誤
用例5:
假設輸入為:
) ] } { ] (
則輸出為:
) 匹配錯誤
uj5u.com熱心網友回復:
看你的用例,應該是只列印第一次不匹配的錯誤,所以遇到不匹配,列印后就退出回圈就好了void Bracketmatch(const char* c) //括號匹配
{
bool bj=true;
char t;
stack s1(strlen(c)+1);
for (unsigned int i = 0; i < strlen(c); i++)
{
t = c[i];
switch (t)
{
case '(':
s1.push(t);
break;
case '[':
s1.push(t);
break;
case '{':
s1.push(t);
break;
case ')':
if (s1.top1() == '(')
{
s1.pop();
break;
}
else
{
cout << c[i] << " 匹配錯誤" << endl;
bj = false;
break;
}
case ']':
if (s1.top1() == '[')
{
s1.pop();
break;
}
else
{
cout << c[1] << " 匹配錯誤" << endl;
bj = false;
break;
}
case '}':
if (s1.top1() == '{')
{
s1.pop();
break;
}
else
{
cout << c[i] << " 匹配錯誤" << endl;
bj = false;
break;
}
default:
break;
}
if (!bj) break; //加這一句就好了,只要有錯,就不再繼續往下查找匹配了
}
if (bj)
{
if (s1.empty())
{
cout << "匹配正確!" << endl;
}
else
cout << s1.top1() << " 匹配錯誤" << endl;
}
}
uj5u.com熱心網友回復:

還是不對
是不是stack類有問題
uj5u.com熱心網友回復:
主要是你判斷堆疊頂元素的時候沒有判斷堆疊是否為空,所以就會造成st[top]的top為-1修改方法一是判斷堆疊頂元素之前判斷堆疊是否為空,比如
if(!s1.empty() && s1.top1()==‘(‘)
修改方法二是top1方法追加一個判斷,比如
if(top==-1) return -1;
return st[top];
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/188350.html
標籤:C語言
上一篇:機考題
