高分求助 那位老大可以给我一个判断括号是否配对的程序(30分)

  • 主题发起人 主题发起人 shhw
  • 开始时间 开始时间
S

shhw

Unregistered / Unconfirmed
GUEST, unregistred user!
哪一位老大可以给小弟一个程序,实现功能为判断括号是否配对,主要包括下面三种:()、[]、{}。
要求用C++来完成。
下面是用Delphi做的 ,能帮助改写成VC++也可以
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
//查找字符串中给定的字符,并返回出现的次数
function LookupStr(Astr,AfindStr:string;Var ADegree:integer ):Boolean;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var s,Stemp,Stemp1,Stemp3:string;
i,x,leftLength,rigthLength:integer;
leftbool,rigtbool:boolean;
begin
//记录提前设置好的括号
Stemp := '(),{},[]';
//把输入的表达式赋给变量S
s:= Edit1.Text
//给X赋值-2
x:= -2;
for i:= 1 to length(Stemp)do
begin
x:= x+3;
Stemp1 := copy(Stemp,x,1);
//截取前括号
Stemp3 := copy(Stemp,x+1,1);
//截取后括号
//判断表达式中括号的个数
leftbool := LookupStr(s,Stemp1,leftLength);
rigtbool := LookupStr(s,Stemp3,rigthLength);
if (not leftbool) And (not rigtbool) then
Continue
else
begin
if leftLength <> rigthLength then
begin
Application.MessageBox(Pchar('您输入的表达式中 "'+Stemp1+'" 不配对'), '提示', MB_ICONINFORMATION+MB_SYSTEMMODAL);
Break;
end;
end;

leftLength := pos(Stemp1,s);
//计算前括号的长度
rigthLength := pos(Stemp3,s);//计算后括号的长度
//判断表达式中的括号是否配对
if (leftLength > rigthLength) then
begin
ShowMessage('您输入的表达式中 "'+Stemp1+'" 书写错误');
break;
end;
leftLength:=0;
rigthLength := 0;
end;
end;

function TForm1.LookupStr(Astr, AfindStr: string;
var ADegree: integer): Boolean;
var i:integer;
stemp:string;
begin
Result := false;
for i:= 1 to length(Astr)do
begin
stemp := copy(Astr ,i,1);
if stemp = AfindStr then
begin
ADegree := ADegree +1;
Result := true;
end;
end;
end;

end.
 
用栈来实现,三中类型,用三个栈
遍历字符串, ( 入栈, ) 出栈 ,
[] {}
同上,结束后看看栈里还有没
 
这个比较难做的,不是说“(”和“)”成配对出现的,有时会这样的“(”和“(”再才是“)”和“)”的。要做到人性化比较难。如果一定是成配对出现就太简单了,我想你要的是不成配对出现的吧。
 
补充:fu_abing
可以用栈实现的
遍历字符串,碰见左括号入栈,遇到相应的右括号的出栈。
结束后看看栈里还有没。
 
一个简担的下推自动机就行了
 
#define TRUE 1
#define FALSE 0
#define Stack_Size 50
#define StackElementType char
/*顺序栈*/
typedef struct
{
StackElementType elem[Stack_Size];
/*用来存放栈中元素的一维数组*/
int top;
/*用来存放栈顶元素的下标,top为-1表示空栈*/
}SeqStack;

/*初始化*/
void InitStack(SeqStack *S)
{
/*构造一个空栈S*/
S->top = -1;
}
/*判栈空*/
int IsEmpty(SeqStack *S) /*判断栈S为空栈时返回值为真,反之为假*/
{
return(S->top==-1?TRUE:FALSE);
}
/*判栈满*/
int IsFull(SeqStack *S) /*判断栈S为满栈时返回值为真,反之为假*/
{
return(S->top==Stack_Size-1?TRUE:FALSE);
}
int Push(SeqStack *S,StackElementType x)
{
if(S->top==Stack_Size-1)
return(FALSE);
/*栈已满*/
S->top++;
S->elem[S->top] = x;
return(TRUE);
}
int Pop(SeqStack *S,StackElementType *x)
{
/* 将栈S的栈顶元素弹出,放到x所指的存储空间中 */
if(S->top == -1) /*栈为空*/
return(FALSE);
else
{
*x = S->elem[S->top];
S->top--;
/* 修改栈顶指针 */
return(TRUE);
}
}
/*取栈顶元素。*/
int GetTop(SeqStack *S,StackElementType *x)
{
/* 将栈S的栈顶元素弹出,放到x所指的存储空间中,但栈顶指针保持不变 */
if(S->top == -1) /*栈为空*/
return(FALSE);
else
{
*x = S->elem[S->top];
return(TRUE);
}
}
/*进行匹配*/
int Match(char ch,char str)
{
if(ch=='(' && str==')')
{
return TRUE;
}
else
if(ch=='[' && str==']')
{
return TRUE;
}
else
if(ch=='{' && str=='}')
{
return TRUE;
}
else

return FALSE;
}
这是C++ 完整程序 希望能帮到你
 
后退
顶部