如何实现快速的括号匹配

iamalpha 2003-11-08 08:13:19
就是检查括号()[]{}之间的匹配情况
如果文件很大的话,如何快速的找出是否匹配正确?
a.t.t 3x
...全文
100 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
steve0531 2003-11-08
  • 打赏
  • 举报
回复
@o@
saien 2003-11-08
  • 打赏
  • 举报
回复
楼上正确
短歌如风 2003-11-08
  • 打赏
  • 举报
回复
program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils,
Contnrs;

type
TCharStack = class(TStack)
private
function GetTop: Char;
public
function Pop: Char;
function Push(Item: Char): Char;
property Top: Char read GetTop;
end;

{ TCharStack }

function TCharStack.GetTop: Char;
begin
Result := Char(Peek);
end;

function TCharStack.Pop: Char;
begin
Result := Char(inherited Pop);
end;

function TCharStack.Push(Item: Char): Char;
begin
Result := Char(inherited Push(Pointer(Item)));
end;

function FindFirstOf(const Str: String; const CharSet: TSysCharSet; StartPos: Integer = 1): Integer;
begin
Result := StartPos;
while (Result <= Length(Str)) and not (Str[Result] in CharSet) do
Inc(Result);
if Result > Length(Str) then
Result := 0;
end;

const
NPos = 0;
FindSet = ['(',')','{','}','[',']'];
var
Stack: TCharStack;
Line: String;
Inf: TextFile;
Pos: Integer;
LineNumber: Integer = 0;

procedure Check;
begin
while not Eof(inf) do
begin
ReadLn(inf, Line);
Pos := FindFirstOf(Line, FindSet);
while(Pos <> NPos) do
begin
case Line[Pos] of
'(', '[', '{':
Stack.Push(Line[Pos]);
')':
if (Stack.Count = 0) or (Stack.top <> '(') then
begin
WriteLn('Error:', LineNumber, ':', Copy(Line, 1, Pos));
Halt;
end
else
Stack.Pop();
']':
if (Stack.Count = 0) or (Stack.top <> '[') then
begin
WriteLn('Error:', LineNumber, ':', Copy(Line, 1, Pos));
Halt;
end
else
Stack.Pop();
'}':
if (Stack.Count = 0) or (Stack.top <> '{') then
begin
WriteLn('Error:', LineNumber, ':', Copy(Line, 1, Pos));
Halt;
end
else
Stack.Pop();
end;
Pos := FindFirstOf(Line, FindSet, Pos +1);
end;
Inc(LineNumber);
end;
if Stack.Count > 0 then
WriteLn('Error!')
else
WriteLn('OK!');
ReadLn;
end;
begin
AssignFile(inf, 'e:\utilcls.h');
Reset(Inf);
Stack := TCharStack.Create;
try
Check;
except
end;
Stack.Free;
CloseFile(Inf);
end.
短歌如风 2003-11-08
  • 打赏
  • 举报
回复
用栈。
遇到"([{"入栈,遇到")]}"出栈并检查匹配。
每次读一行,在一行的字符串中查找"(){}[]"中的字符第一次出现的位置。处理后向后继续查找直到串尾。
只要你在字符串中查找的函数比较快,它就不会很慢。
dickeybird888 2003-11-08
  • 打赏
  • 举报
回复
(@ # @)
iamalpha 2003-11-08
  • 打赏
  • 举报
回复
呵呵,还有如何出错处理
就是不匹配的话,如何继续处理下面的数据
TheTop 2003-11-08
  • 打赏
  • 举报
回复
文件再大你都要扫描一次吧?

我想栈已经到尽头了,只能作些针对性的优化.

不过,也来听听课...

liyangyao970 2003-11-08
  • 打赏
  • 举报
回复
用栈匹配呀!
不知道更好的算法呀
希望高手讲讲
iamalpha 2003-11-08
  • 打赏
  • 举报
回复
我知道用栈可以实现,不知道有没有更快的算法
edgethinking 2003-11-08
  • 打赏
  • 举报
回复
去看数据结构的书吧,上面讲了。

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧