顺序栈判断括号是否匹配

/*Sample Input
sin(20+10)
{[}]
Sample Output
yes
no*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int status;
typedef char elemtype;
elemtype str[100];
typedef struct node{
      elemtype *base;
      elemtype *top;
      int size;
}sqstack;
status initstack(sqstack &s){//初始化栈
     s.base=(elemtype *)malloc(LIST_INIT_SIZE*sizeof(elemtype));
     if(!s.base)
        exit(OVERFLOW);
        s.top=s.base;
        s.size=LIST_INIT_SIZE;
        return OK;
}
status get_top(sqstack s,elemtype &e){//获得栈顶元素
     if(s.top==s.base)
     return ERROR;
     e=*(s.top-1);
     return OK;
}
status push(sqstack &s,elemtype e){//向栈中输入元素
     if(s.top-s.base>=s.size){
        s.base=(elemtype *)realloc(s.base,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(elemtype));
        if(!s.base)
             exit(OVERFLOW);
             s.top=s.base+s.size;
             s.size+=LISTINCREMENT;
     }
     *s.top++=e;
     return OK;
}
status pop(sqstack &s,elemtype &e){//删除栈顶元素
      if(s.top==s.base)
      return ERROR;
      e=*--s.top;
      return OK;
}
status empty(sqstack &s){//判断栈是否为空
      if(s.base==s.top)
      return TRUE;

      else
      return FALSE;
}
int getlenght(char str1[]){
  int cnt=0;
  for(int i=0;str1[i];i++){
    cnt++;
  }
  return cnt;
}
int main(){
        while(gets(str)){
        int len=getlenght(str);
        sqstack s;
        initstack(s);
        elemtype e;
        int flag=0;
          for(int i=0;i<len;i++){
              if(flag)
              break;
              if(str[i]==‘(‘||str[i]==‘{‘||str[i]==‘[‘){
                 e=str[i];
                 push(s,e);
              }
              else if(str[i]==‘)‘||str[i]==‘}‘||str[i]==‘]‘){
                     if(empty(s)){
                         flag=1;
                         break;
                     }
                   pop(s,e);
                   if((str[i]==‘)‘&&e==‘(‘)||(str[i]==‘}‘&&e==‘{‘)||(str[i]==‘]‘&&e==‘[‘))
                   {
                        continue;
                   }
                   else{
                     flag=1;
                     break;
                   }
              }
              else continue;
          }
          if(flag==1||!empty(s))
          printf("no\n");
          else
          printf("yes\n");
}
        return 0;
}
时间: 2024-11-01 04:20:05

顺序栈判断括号是否匹配的相关文章

【数据结构】用栈检测括号是否匹配

//[数据结构]用栈检测括号是否匹配 //头文件 栈 #ifndef _STACK_ #define _STACK_ #include <iostream> #include <string.h> using namespace std; template <class Type> class Stack { public: Stack(size_t sz = INIT_SIZE) { capacity = sz > INIT_SIZE ? sz : INIT_S

(编程训练)再回首,数据结构——(升级版)使用栈判断括号匹配

点击打开 基础版 最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. 在VC++6.0下可运行,当初还写了不少注释. /* ********************************************************** * 3-2 * 设在一个算术表达式中允许使用3种括号:圆括号"(".")",方 * 括号"["."]",花括号"

Python 用栈判断括号匹配

#!/usr/bin/python # -*- coding: UTF-8 -*- from pythonds.basic.stack import Stack def parChecker(symbolString): s = Stack() balanced = True index = 0 while index < len(symbolString) and balanced: symbol =symbolString[index] #左边括号入栈 if symbol == '(': s

括号成对出现、判断括号是否匹配(不用堆栈)

思路:先创建一个字符数组,从第0个位置依次开始计数,只要满足"{"的个数大于等于"}"并且最后两者个数相等,就能匹配成功. #include<stdio.h> #include<stdlib.h> #include<windows.h> int main() {  char str[10];  int i,count1=0,count2=0;  printf("请输入:\n");  gets_s(str, 10

括号匹配问题(顺序栈实现)

本周老师作业留了两个.先上传一个吧.那个有时间我再传上来~ 本周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素和判空操作 括号匹配问题 3.编写主函数实现基本操作函数功能,并设置测试数据,测试合法和非法数据的输出结果. 4.程序调试运行并保存输出结果. 5.整理并提交实验作业. 1 #include <cstdio> 2 #include <cstring>

栈的应用-判断括号匹配

栈的一个典型应用就是可以用来协助分析表达式的括号是否匹配.括号可以延伸到任何成对出现的界定符,例如引号,书名号等. 接下来给出程序实现: 第一部分给出的是堆栈的插入,删除等操作对应的实现: 1 public class StackChar 2 { 3 private int maxSize;//堆栈数组大小 4 private char [] stackArray; 5 private int top;//堆栈顶 6 public StackChar(int maxSize) 7 { 8 thi

利用栈判断输入的表达式中的括号是否匹配(假设只含有左、右括号)

利用栈判断输入的表达式中的括号是否匹配(假设只含有左.右括号) bool Match(char exp[],int n) { int i=0; char e; bool match=true; SqStack *st; InitStack(st);//初始化栈 while(i<n && match)//扫描exp中所有字符 { if(exp[i]=='(')//当前字符为左括号,将其进栈 Push(st,exp[i]); else if(exp[i]==')')//当前字符为右括号

常见算法题:判断表达式括号是否匹配

题目:设计一个算法,判断用户输入的表达式中括号是否匹配,表达式中可能含有圆括号.中括号和大括号. 思路:建立一个顺序栈,当表达式中有左括号时将其入栈,当出现右括号时,将栈顶元素出栈,检查与当前右括号是否匹配.最后如果栈为空则表示该表达式中的括号是匹配的. 代码: #include<iostream> #include<string> using namespace std; #define MaxSize 20 //字符串栈 class Stack { char *data; in

DS之顺序栈和链队实现回文判断

顺序栈和链队的基本操作就不再一一列举了,要想实现回文判断,先来了解什么是回文?"回文"一字符串正着读和反着读是相同的字符序列,如"abcba","abba"为"回文","abab"则不是"回文". 其次就是顺序栈和链队如何实现回文的判断?将输入的字符串依次入栈和入队,然后再依次出栈和出队,由于入栈和入队是相同的序列,然而出栈和出队是相反的序列,这就实现了回文的判断. 最后考虑要用到顺序栈