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

问题描述

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

本人新手+小白一枚
这段程序看了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");
}

解决方案

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

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("successn");//匹配成功
else//如果不为空
printf("not matchn");//匹配不成功

}

解决方案二:

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

解决方案三:

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

解决方案四:

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

时间: 2024-09-17 12:28:03

c语言栈的平衡符号的问题的相关文章

adl语言-ADL语言 数据结构 几种符号问题

问题描述 ADL语言 数据结构 几种符号问题 ADL语言里 X / div 有什么区别呢 求各位指教!!! 解决方案 adl语言本质上说是一种伪代码.它的目的不是建立一种编程语言,而是用一种类似编程语言的方式编写给人看的文档.所以表达上不是很严格,就你说的运算符,或者直接用英文单词缩写,都可以.没区别.

举例讲解C语言链接器的符号解析机制_C 语言

1. 符号分类(1)全局符号:非静态全局变量,非静态函数 (2)外部符号:定义于其它模块,而被本模块引用的全局变量和函数 (3)本地符号:静态变量(包括全局和局部),静态函数 对于静态局部变量,编译器会为其生成唯一的名字.如x.fun1,x.fun2.本地符号对链接器来说是不可见的.2. 符号决议当编译器遇到一个不是本模块定义的符号时,会假设该函数由其它模块定义,并生成一个链接器符号表条目,交由链接器处理.如果链接器在它的任何输入模块都没有找到该符号,会给出一个类似undefined refer

C语言 栈的表示和实现详细介绍_C 语言

C语言 栈的表示和实现详细介绍 定义:栈是限定仅在表尾进行插入和删除操作的线性表. 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来).栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针. 栈是允许在同一端进行插入和删除操作的特殊线性表.允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom):栈底固定,而栈顶浮动:

C语言参考程序—无符号一位整数的四则运算

题目:输入一个无符号的一位整数的四则运算表达式,输出其结果.例如输入:1+3*6-2,则输出:17 分析:因为不涉及到括号,只是简单的四则运算,我的想法是如果有乘除法先计算,没有的话就按照加减法从左到右的顺序进行计算.在开始的时候,首先检查是否有乘除法运算符,有的话就取出前后两个操作数进行计算,将结果保存起来.没有的话就将加减运算符先存起来. 主要过程: 1.输入的是一个四则运算的表达式,在计算机中按照字符串的形式存储.数据和运算符需要分开处理. 2.引入一个整型的数组,其大小为字符串长度加一,

C语言之将无符号字符型转化为ascii码值

这个宏是在linux内核中获取的,主要的功能是能够将一个无符号字符型的参数转化为ASCII码值. ASCII : ASCII 编码里包括了128个字符.用 十进制 0  到 127 来表示 .那就对了, 0 到 127 不就是 128个字符吗. 每一个数字都代表一个字符.看ASCII 编码表 我们来看看代码: #include <stdio.h> #include <stdlib.h> #define toascii(c) (((unsigned char)(c))&0x7

c语言栈-栈的基本操作输入输出

问题描述 栈的基本操作输入输出 大神们帮忙看看哪儿出问题了,关于栈的基本操作能不能写个代码使得数据从栈底到栈顶的输出 解决方案 代码呢?遍历一次就输出了,具体看你栈的存储结构,有顺序栈.链栈-- 解决方案二: 栈的特点是 先进后出.也就是说 先输出的 是 栈顶元素 而且你没附上代码,不知道怎么帮你看 解决方案三: 栈的基本特点是从顶出,如果可以请使用两个栈:先出栈.压入另一个空栈,再对这个栈出栈就是你想要的效果. 解决方案四: 其实呢你在定义栈的时候是按照一般定义进行的,也就是存在一个栈顶的变量

c语言栈-栈的问题,用栈编写一个算术表达式求值

问题描述 栈的问题,用栈编写一个算术表达式求值 用栈做一个简单的算术运算,我觉得思想没问题,可是编译不过去,上网找了很多资料,觉得是栈的基本操作有问题,初始化有问题,可具体是什么错误我也不是很了解,求大神指教!! #include #include typedef struct { int data[100]; int top1; }SqStack1; typedef struct { char suanfu[100]; int top2; }SqStack2; SqStack1 shuzi;

深入分析C语言中的有符号和无符号

就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负.如果这个量不会有负值,那么我们可以定它为带正负的类型. 在计算机中,可以区分正负的类型,称为有符类型(signed),无正负的类型(只有正值),称为无符类型. (unsigned)数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型. 字符类型也分为有符和无符类型. 比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型. 2.使用二制数中的最高位表

浅谈C语言中的强符号、弱符号、强引用和弱引用_C 语言

首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样感觉的朋友交流也希望高人指点. 首先我们看一下书中关于它们的定义. 引入场景:(1)文件A中定义并初始化变量i(int i = 1), 文件B中定义并初始化变量i(int i = 2).编译链接A.B时会报错b.o:(.data+0x0): multiple definition of `i':a.o:(.d