2 myiloveuuu myiloveuuu 于 2015.06.20 10:05 提问

c语言栈的平衡符号的问题 1C

本人新手+小白一枚
这段程序看了n个小时修改改了很多次还是木有得到真谛,关键就在于check函数判断封闭符号是否和开放鼓号相匹配,一直也没有调试好,请教大神给我指点一下
int
CheckSymbol(Stack S,char str[])
{
int i,j;
for(i=0;i<10;i++)
{
if(str[i]=='{'||str[i]=='('||str[i]=='[')
{
Push(str[i],S);//如果是开放符号则压入栈

      for(j=i;j<10;j++)

      {
          if(str[j]=='}'&&S->Array[S->TopOfStack]=='{'||str[j]==')'&&S->Array[S->TopOfStack]=='('||str[j]==']'&&S->Array[S->TopOfStack]=='[')
      {
          return 0;
          Pop(S);//如果匹配则返回0并且弹出
      }
      else 
         return 1;
      }
  }
  else 
      return 1;
}       

  }

main()
{
char str[10]="1[23";
Stack S;

if(CheckSymbol(S,str)==0)
printf("match");
if(CheckSymbol(S,str)==1)
printf("no match");
}

4个回答

bullzerone
bullzerone   2015.06.20 13:41

这个是栈常见应用之一。
如果遇到括号左边,就入栈,如果是右边,就出栈,最后如果栈为空,说明匹配成功,否则不成功。
下面是我自己写的一个简单测试代码,实现一个括号匹配函数。其中栈我是用字符数组实现的一个简单序列栈。没给出栈代码,你看你自己栈的实现。

void Match(char* a,int size)
{

int i;
for(i=0;i<size;i++)
{
    if(a[i]=='('||a[i]=='['||a[i]=='{')//如果是括号左边
    {
        pushstack(a[i]);//入栈
    }
    else if(a[i]==')'||a[i]==']'||a[i]=='}')//如果是括号右边
    {
        popstack();//出栈
    }
}
if(emptystack())//如果栈为空
printf("success\n");//匹配成功
else//如果不为空
printf("not match\n");//匹配不成功

}

myiloveuuu
myiloveuuu   2015.06.21 10:48

谢谢你这么热心为我解答,我有一个问题,你怎么能知道符号是匹配的呢

myiloveuuu
myiloveuuu   2015.06.21 10:48

谢谢你这么热心为我解答,我有一个问题,你怎么能知道符号是匹配的呢

bullzerone
bullzerone   2015.06.21 11:28

一会儿我给你发个图片,演示一下,这个图片是拍的,比我实现的复杂。你看一下,它还会匹配 /*和*/。过程是开始栈为空,开始如果遇到左边就入栈,遇到右边
就出栈,出栈的是和最近遇到的右括号 匹配的左括号。如果最后栈空了,说明是匹配的,否则就不匹配。

图片说明

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
栈的应用 - 符号平衡问题
在编程语言中,经常需要判断一些符号是否成对出现,比如<>、()、[]、{},在C++中通常也只有这些对称问题。当然,还有引号的匹配、注释符号的匹配等,在匹配过程中还可能出现转义字符的问题。简便起见,在此只考虑四种括号的匹配问题,并且不考虑转义字符。   借助于栈,可以很方便的判定一个字符串是否是符号平衡的,具体地,从左至右扫描字符串,如果是左括号,则直接入栈,如果是右括号,则栈顶元素退栈,并且将该元
栈的应用之检测平衡符号
前言 本文主要是模拟这样一个场景:编译器检查程序的语法错误,在本文中,我不打算实现某种编程语言的语法检查,而是将问题限定在——检测括号是否成对上。 最终我们希望达到这样一个效果:每一个右花括号、右方括号、右大括号,必然要对应一个相应的左花括号、左方括号以及左大括号。也就是说; 1.序列:{[()]} 是合法的。 2.序列:{[()]}} 则是非法的。 算法 本文的算法可以描述如
重学数据结构005——栈的应用之平衡符号
之前学习了栈的基本操作,并且学习了栈的两种实现方式:链式存储和顺序存储(数组)。现在看看栈都有哪些应用。栈的一个主要应用是平衡符号。         初学者在编写代码并且编译时,难免会因为少写了一个')'和被编译器报错。也就是说,编译器会去匹配括号是否匹配。当你输入了一个'(',很自然编译器回去检查你是否有另一个')'符号与之匹配。如果所有的括号都能够成对出现,那么编译器是能够通过的。否则编译器
栈的应用-平衡符号(C版)
编译器检查程序的语法错误,比如括号是否成对出现。 基本思想:做一个空栈。读入字符直到文件结尾,如果字符是一个开放符号,将其入栈。如果是一个封闭符号,则当栈空时报错,否则,将元素弹出,如果弹出的符号不是其对应的开放符号,则报错。到了文件尾,如果栈非空则报错。 //堆栈的定义和实现此处忽略 BracketChecker.h /**从键盘读入字符串**/ void getString(c
栈的应用之平衡符号
//此代码只验证圆括号,方括号,大括号的平衡与否 //做一个空栈 //读入字符到文件末尾 //如果一个字符是开放符号(即左括号),放入栈中 //如果一个符号是封闭符号(即右括号) //一:如果此时栈空,报错 //二:与栈头对比是否平衡,若对应,则平衡,并弹出栈头;若不对应,报错 //在文件尾,若栈非空,报错 #include #include char stack[100];//栈 int t
Java栈的应用检测平衡符号
本文来源于啊:http://blog.csdn.net/hengjie2009/article/details/8478863package cn.thj.data_structures; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.Input
使用栈来实现符号平衡----c语言实现
使用栈来实现符号平衡—-c语言实现用栈比较容易实现的应用:符号平衡 源码如下:#include <stdio.h> #include <malloc.h> /* 编程思路:为实现符号平衡,先创建一个空栈,先读入一对符号 的左边,直到读入这对符号的右边,把符号弹出,如果这对符号 对称则继续,直到最后符号全部读完,并且栈为空。 */ struct node { char symbol;
七、栈实现c语言符号的匹配
1、LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_ typedef void LinkList; typedef struct _tag_LinkListNode LinkListNode; struct _tag_LinkListNode {     LinkListNode* next; }; Link
Java实现:利用栈平衡符号
import java.util.Scanner; import java.util.Stack; public class SymbolTest { public static void main(String[] args) { System.out.println(readSymbol()); } private static boolean readSy
c语言栈实现括号匹配
在文字处理软件或编译程序设计时,常常需要检查一个字符串或一个表达式中的括号是否相匹配? 匹配思想:从左至右扫描一个字符串(或表达式),则每个右括号将与最近遇到的那个左括号相匹配。则可以在从左至右扫描过程中把所遇到的左括号存放到堆栈中。每当遇到一个右括号时,就将它与栈顶的左括号(如果存在)相匹配,同时从栈顶删除该左括号。 算法思想:设置一个栈,当读到左括号时,左括号进栈。当读到右括号时,则从栈中弹