精华内容
下载资源
问答
  • 解题思路:1、判断括号是否多余,即判断括号去除后运算顺序是否改变,亦即判断括号内外的运算符优先级,基本思路即括号内运算符优先级较高则可去括号;2、去括号,用特殊符号标记多余的括号。这里我用栈结构将左括号...

    解题思路:

    1、判断括号是否多余,即判断括号去除后运算顺序是否改变,亦即判断括号内外的运算符优先级,基本思路即括号内运算符优先级较高则可去括号;

    2、去括号,用特殊符号标记多余的括号。

    这里我用栈结构将左括号依次压栈,遇到右括号依次弹栈,由内而外逐层判断多余的括号。

    注意事项:

    运算符优先级:^(幂) > /(除) *(乘) > -(减) +(加);

    由于 - (/) 特殊性(第4点),设置为:^(幂) > /(除) > *(乘) > -(减) > +(加) ,以便于判断。

    特殊情况较多,要逐个考虑:

    1、多层多余括号,如((((1+2))))、((((1)))),可直接去掉多层括号;

    2、单层多余括号,如(1),可直接去掉该层括号;

    3、加法、乘法的结合律,如 1+(2+3) 或 1*(2*3),括号内外运算符优先级相同,但也可去括号;

    4、括号左边符号为 - (/),则去括号后括号内的 + (*) 会变号,故也不满足去括号,由优先级可直接判断;

    5、第4点带来的括号右边的额外判断,如 (1*2)/3 或 (1-2)+3,(原本优先级相同),故满足去括号。

    参考代码:

    #include

    #include

    int level[95] = { 0 };

    // 返回值为是否去括号 - 左括号下标 - 右括号下标

    int ScanString(char *s, int start, int end);

    int main() {

    char s[50], sc[50];

    int stack[50], top = -1, i;

    // 细分运算符优先级,便于判断

    level['+'] = 10, level['-'] = 11, level['*'] = 20, level['/'] = 21, level['^'] = 31;

    while (scanf("%s", s) != EOF && s[0] != '#') {

    strcpy(sc, s); // 复制s,在sc中标记已经扫描的字符

    for (i = 0; i 

    if (sc[i] == '(') { // 左括号依次压栈

    stack[++top] = i;

    }

    if (sc[i] == ')') { // 遇到右括号时,左括号弹栈

    if (ScanString(sc, stack[top--], i)) { // 扫描括号内字符

    s[stack[top + 1]] = s[i] = '#'; // 标记原字符串,去括号

    }

    }

    }

    for (i = 0; i 

    if (s[i] != '#') printf("%c", s[i]);

    }

    printf("\n");

    }

    return 0;

    }

    int ScanString(char *s, int start, int end) {

    // 若有多层多余括号如 ((1+2)),直接返回删除一层括号

    if (start != 0 && end != strlen(s) - 1 && s[start - 1] == '(' && s[end + 1] == ')') {

    return 1;

    }

    int i, lev = 0, f;

    // 对该层括号内运算符进行优先级判断

    for (i = start, f = 1; i <= end; i++) {

    if (s[i] == '#') continue;

    if (level[s[i]] && f) { // 若为第一个运算符

    lev = level[s[i]]; // 直接标记优先级

    f = 0;

    }

    if (level[s[i]]) { // 若有多个运算符,取较低的优先级

    lev = lev 

    }

    s[i] = '#'; // 对判断过的字符进行标记

    }

    if (f) return 1; // 若括号内没有运算符,如(1),直接去掉该层括号

    // 若为第0个字符 或 前一个字符也为左括号 或 括号内优先级较左边高 或 括号内优先级与左边相等且为 + * (结合律),则左边满足

    if (start == 0 || s[start - 1] == '(' || lev > level[s[start - 1]] || lev == level[s[start - 1]] && !(lev % 10)) {

    // 若为最后一个字符 或 后一个字符也为右括号 或 括号内优先级较右边高/相等(左结合性) 或 如(a*b)/c 、(a-b)+c 类,则右边满足

    if (end == strlen(s) - 1 || s[end + 1] == ')' || lev >= level[s[end + 1]] || lev / 10 == level[s[end + 1]] / 10) {

    return 1; // 删除该层括号

    }

    }

    return 0;

    }

    展开全文
  • ='\0'){//遍历字符串 switch(*p){//判断p的值 case '('://左括号,入栈 case '[': case '{': Push(S,*p); //printf("Push %c",*p); break; case ')': if(FALSE==GetTop(*S,&e)) return FALSE; if(e=='('){ if(ERROR=...

    #include #define OK 1

    #define ERROR 0

    #define TRUE 1

    #define FALSE 0

    #define STACK_INIT_SIZE 100

    #define STACKINCREMENT 10

    #define BUFFERSIZE 256

    typedef int Status; //函数返回状态

    typedef char SElemType; //栈元素类型

    typedef struct{//栈结构定义

    SElemType *base;

    SElemType *top;

    int stacksize;

    }SqStack;

    Status InitStack(SqStack *S);

    //构造一个空栈S

    Status DestroyStack(SqStack *S);

    //销毁栈S,S不再存在

    Status ClearStack(SqStack *S);

    //把栈S置为空栈

    Status StackEmpty(SqStack S);

    //若栈S为空栈,则返回TRUE,否则返回FALSE

    int StackLength(SqStack S);

    //返回S元素的个数,即栈的长度

    Status GetTop(SqStack S,SElemType *e);

    //若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回FALSE

    Status Push(SqStack *S,SElemType e);

    //插入元素e为新的栈顶元素

    Status Pop(SqStack *S,SElemType *e);

    //若栈S不为空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR

    Status StackTraverse(const SqStack *S);

    //从栈底到栈顶依次对每个元素进行访问

    Status BracketMatch(SqStack *S,const char *string);

    //输入字符串string中的括号匹配,返回TRUE;否则返回FALSE

    int main()

    {

    char *string;

    SqStack stack;

    string=(char*)malloc(sizeof(char)*BUFFERSIZE);

    if(!string){

    printf("分配内存失败.\n");

    exit(0);

    }

    while(1){

    printf("请输入一行含括号的表达式(输入\"!\"退出):");

    gets(string);

    if(string[0]=='!')//退出

    break;

    if(TRUE==BracketMatch(&stack,string)){

    printf("\n能 正确匹配.\n\n");

    }else{

    printf("\n不能 正确匹配.\n\n");

    }

    }//while

    return 0;

    }

    Status InitStack(SqStack *S){

    //构造一个空栈S

    S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));

    if(!S->base)//分配失败

    {

    printf("分配内存失败.\n");

    exit(0);

    }

    S->top=S->base;

    S->stacksize=STACK_INIT_SIZE;

    return OK;

    }

    Status DestroyStack(SqStack *S){

    //销毁栈S,S不再存在

    if(!S)//S为空

    {

    printf("指针为空,释放失败.\n");

    exit(0);

    }

    free(S);

    return OK;

    }

    Status ClearStack(SqStack *S){

    //把栈S置为空栈

    if(!S)//S不存在

    return FALSE;

    S->top=S->base;//直接将栈顶指针指向栈底

    return OK;

    }

    Status StackEmpty(SqStack S){

    //若栈S为空栈,则返回TRUE,否则返回FALSE

    if(S.top==S.base)

    return TRUE;

    else

    return FALSE;

    }

    int StackLength(SqStack S){

    //返回S元素的个数,即栈的长度

    return S.stacksize;

    }

    Status GetTop(SqStack S,SElemType *e){

    //若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回FALSE

    if(S.top==S.base){

    //printf("栈为空.\n");

    return FALSE;

    }else{

    *e=*(S.top-1);

    //printf("%c",*e);

    return OK;

    }

    }

    Status Push(SqStack *S,SElemType e){

    //插入元素e为新的栈顶元素

    if(S->top-S->base>=S->stacksize){//栈已满,追加存储空间

    S->base=(SElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));

    if(!S->base)

    {

    printf("重新申请空间失败.\n");

    exit(0);

    }

    S->top=S->base+S->stacksize;//更改栈顶指针

    S->stacksize+=STACKINCREMENT;

    }

    *S->top++=e;

    return OK;

    }

    Status Pop(SqStack *S,SElemType *e){

    //若栈S不为空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR

    if(S->top==S->base){//栈为空

    printf("栈为空.\n");

    return ERROR;

    }

    *e=*(--S->top);

    return OK;

    }

    Status StackTraverse(const SqStack *S){

    //从栈底到栈顶依次对每个元素进行访问

    SElemType *p=S->base;

    if(S->base==S->top)

    {

    printf("栈为空.\n");

    return FALSE;

    }

    //printf("栈中元素:");

    while(p!=S->top)

    {

    printf("%c",*p++);

    }

    printf("\n");

    return OK;

    }

    Status BracketMatch(SqStack *S,const char *string){

    //输入字符串string中的括号匹配,返回TRUE;否则返回FALSE

    const char *p=string;

    SElemType e;

    InitStack(S);

    while(*p!='\0'){//遍历字符串

    switch(*p){//判断p的值

    case '('://左括号,入栈

    case '[':

    case '{':

    Push(S,*p);

    //printf("Push %c",*p);

    break;

    case ')':

    if(FALSE==GetTop(*S,&e))

    return FALSE;

    if(e=='('){

    if(ERROR==Pop(S,&e))

    return FALSE;

    //printf("Push %c",*p);

    }else

    return FALSE;

    break;

    case ']':

    if(FALSE==GetTop(*S,&e))

    return FALSE;

    if(e=='['){

    if(ERROR==Pop(S,&e))

    return FALSE;

    //printf("Push %c",*p);

    }else

    return FALSE;

    break;

    case '}':

    if(FALSE==GetTop(*S,&e))

    return FALSE;

    if(e=='{'){

    if(ERROR==Pop(S,&e))

    return FALSE;

    //printf("Push %c",*p);

    }else

    return FALSE;

    break;

    default:

    ;

    }//switch

    p++;

    }//while

    if(!StackEmpty(*S))//字符串遍历完,栈非空,不匹配

    return FALSE;

    return TRUE;

    }

    展开全文
  • 批量修改文件名的时候怎么去掉括号?使用 Total Commander 最强的文件更名器了,设置>选项>操作>鼠标使用右键选择...: 1)任一窗口打开要更名的目录, 按Ctrl+B,列出所有文件, 按Ctrl+A,选中所有文件,...

    批量修改文件名的时候怎么去掉括号?

    使用 Total Commander 最强的文件更名器了,设置>选项>操作>鼠标使用右键选择...: 1)任一窗口打开要更名的目录, 按Ctrl+B,列出所有文件, 按Ctrl+A,选中所有文件,或者点右键选择所需文件 按Ctrl+M,文件名输入框中,输入新文件名格式。

    @Echo Off&SetLocal ENABLEDELAYEDEXPANSION FOR %%a in (*) do ( set "@Echo Off&SetLocal ENABLEDELAYEDEXPANSION ::关闭回显,设置变量延迟 FOR %%a in (*) do ( ::获取文件名 set "name=%%a" ::把获取到的文件名赋值给 变量 name set "name=。name: (=。" ::使用 SET 命令的变量替换功能 把name中的 ( 替换为空,即 。

    f4f3213d39dc9711f37da1477b030f25.png

    重命名多个文件不要有括号怎么操作 在线等

    如何批量重命名照片,但是去掉那个烦人的括号

    有高手会让Win7下批量重命名文件去掉括号再编号变软件就不要推荐了,我是用CHB Renamer v2.5,很强悍的,只是喜欢探索新喜欢探索新方法何不去用Total Commander?除了常规的计数、时间、替换等等,更支持正则表达式,足够你折腾。

    怎么批量重命名txt文件 ————把括号去掉 例如《神墓试试 文件批量处理百宝箱V8.0 主界面中的删除功能,分两步操作,分别删除《,然后在删除》 或者其更多功能-拓展界面-通配符更名或正则更名。 通配符更名操作方法: 在查找框中输入:(*)《(*)》(*),替换为框中输入:\1\2\3。

    展开全文
  • // 顺序栈 Status InitStack(SqStack *S) { // 构造一个空栈S (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!(*S).base) exit(OVERFLOW); /* 存储分配失败 */ (*S).top=(*S).base; (*S)....

    #include#define TRUE 1

    #define FALSE 0

    #define OK 1

    #define ERROR 0

    typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等

    #define STACK_INIT_SIZE 10 //存储空间初始分配量

    #define STACKINCREMENT 2 // 存储空间分配增量

    typedef char SElemType;// 定义栈元素类型为字符型

    typedef struct SqStack

    {

    SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL

    SElemType *top; // 栈顶指针 */

    int stacksize; // 当前已分配的存储空间,以元素为单位

    }SqStack; // 顺序栈

    Status InitStack(SqStack *S)

    { // 构造一个空栈S

    (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));

    if(!(*S).base)

    exit(OVERFLOW); /* 存储分配失败 */

    (*S).top=(*S).base;

    (*S).stacksize=STACK_INIT_SIZE;

    return OK;

    }

    Status StackEmpty(SqStack S)

    { /* 若栈S为空栈,则返回TRUE,否则返回FALSE */

    if(S.top==S.base)

    return TRUE;

    else

    return FALSE;

    }

    Status Push(SqStack *S,SElemType e)

    { /* 插入元素e为新的栈顶元素 */

    if((*S).top-(*S).base>=(*S).stacksize) /* 栈满,追加存储空间 */

    {

    (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));

    if(!(*S).base)

    exit(OVERFLOW); /* 存储分配失败 */

    (*S).top=(*S).base+(*S).stacksize;

    (*S).stacksize+=STACKINCREMENT;

    }

    *((*S).top)++=e;

    return OK;

    }

    Status Pop(SqStack *S,SElemType *e)

    { /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */

    if((*S).top==(*S).base)

    return ERROR;

    *e=*--(*S).top;

    return OK;

    }

    void check()

    { /* 对于输入的任意一个字符串,检验括号是否配对 */

    SqStack s;

    SElemType ch[80],*p,e;

    if(InitStack(&s)) /* 初始化栈成功 */

    {

    printf("请输入表达式n");

    gets(ch);

    p=ch;

    while(*p) /* 没到串尾 */

    switch(*p)

    {

    case '(':

    case '[':Push(&s,*p++);break; /* 左括号入栈,且p++ */

    case ')':

    case ']':

    if(!StackEmpty(s)) /* 栈不空 */

    {

    Pop(&s,&e); /* 弹出栈顶元素 */

    if(*p==')'&&e!='('||*p==']'&&e!='[') /* 弹出的栈顶元素与*p不配对 */

    {

    printf("左右括号不配对n");

    exit(ERROR);

    }

    else

    {

    p++;

    break; /* 跳出switch语句 */

    }

    }

    else /* 栈空 */

    {

    printf("缺乏左括号n");

    exit(ERROR);

    }

    default: p++; /* 其它字符不处理,指针向后移 */

    }

    if(StackEmpty(s)) /* 字符串结束时栈空 */

    printf("括号匹配n");

    else

    printf("缺乏右括号n");

    }

    }

    int main(int argc, char* argv[])

    {

    check();//括号匹配

    return 0;

    }

    展开全文
  • 用栈实现括号匹配:依次扫描所有字符,遇到左括号则入栈,遇到右括号则弹出栈顶元素检查是否匹配。 匹配失败情况: 1、左括号单身 2、右括号单身 3、左右括号不匹配 #include <iostream> #include <...
  • 给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。输入格式:输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、...
  • 问题及代码:/** Copyright (c) 2016, 烟台大学计算机与控制工程学院* All rights reserved.* 文件名称:date.cpp* 作 ...设计一个算法采用“顺序栈”判断表达式中的括号是否正确配对。* 程序输入:一个字符串表达式...
  • 大家猜猜我这段时间都干啥了哇!没错,参加学校的生产实习啦歪!每天自己PUA自己写代码:你这么菜,还不认真敲代码?(狗头) 一开始死命的纠结到底水一水实训还是认真搞哇!!最后还是选择踏踏实实搞实训得了,...
  • 基于顺序栈的括号匹配问题c语言代码实现 #include<stdio.h> #include<stdlib.h> #define maxsize 10 typedef struct { char data[maxsize]; int top; }stack; void initstack(stack &s) { s.top...
  • 编写一个算法判断输入的表达式中括号是否配对(假设只含有左、右圆括号)编写一个算法判断输入的表达式中括号是否配对(假设只含有左、右圆括号) 输入: (1+2*(5+3)/2) 输出: (1+2*(5+3)/2) 是括号匹配的 代码实现:...
  • 题设:在表达式中,只有【】和()两种括号,如(【】)【(【】【】)】等为正确格式,【(】)或【()或(()】)均为不正确格式。编写程序检验表达式序列是否正确。 检验方法描述:“期待的急迫程度” 可能出现...
  • 顺序栈解决括号匹配问题 测试代码 #include <stdio.h> #include <string.h> #define MaxStackSize 100 typedef char DataType; #include "SeqStack.h" void ExpIsCorrect(char exp[], int n){ //...
  • 顺序栈实现括号匹配 算法思想如下: #include<stdio.h> #include<stdbool.h> #define MAXSIZE 10 typedef struct StackArr { char data[MAXSIZE]; int top; }Stack,*PSTACK; //函数声明 void ...
  • 采用顺序栈判断表达式中的括号是否正确配对 【习题描述】 习题描述: h. 假设表达式中允许包含3中括号:圆括号、方括号和大括号。设计一个算法采用顺序栈判断表达式中的括号是否正确配对。 用例1: 假设输入为: {1*...
  • select * from test where a = 1 or b = 1 and c = 0 or c = 1 这样会检索 a=1 或者 b =1 或者 c=1的结果集,再过滤出其中 c=0的结果,这个不是我期望的,所以用括号括起来调整他们的处理顺序就OK了。 先筛选同一个...
  • 【Leetcode刷题篇】- Leetcode括号(有效括号括号生成、最长有效括号) 括号 有效的括号 最长的有效括号 有效的 括号字符串 使括号有效的最少添加 有效括号的嵌套深度 反转每对括号间的子串 1.Leetcode 面试题...
  • 括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括 号之间不必有空格。 命令替换。等同于cmd,shell...
  • 的区别Include 头文件的顺序双引号和尖括号的区别:当前头文件目录 Include 头文件的顺序 对于 include 的头文件来说,如果在文件 a.h 中声明一个在文件 b.h 中定义的变量,而不引用 b.h。那么要在 a.c 文件中引用 b...
  • 购买本课程后,可以加51CTO学院李宁老师官方...17-按给定的字母顺序对字符串数组进行排序 18-判断字符串中是否包含重复字符(蛮力法) 19-判断字符串中是否包含重复字符(空间换时间) 20-找到由其他单词组成的最长单词
  • 注:下列代码中的注释都是JUnit4单元测试运行...public classA {{System.out.println("我是父类-----大括号中的代码");}static{System.out.println("我是父类-------static代码块");}publicA(){System.out.printl...
  • PIPIOJ 1036: 括号匹配

    2021-03-28 10:17:11
    PIPI给你一个合法的括号序列,希望跟你按左括号下标递增顺序给出每对括号在序列中的下标。(下标从1开始) 输入: 多组数据 第一行包括一个只包含’(’,’)'的字符串,保证输入的括号匹配序列合法,长度不超过100000...
  • 检验括号匹配的算法

    2021-05-21 07:30:51
    数据结构 括号匹配的检验 C++假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即直接使用栈就可以了。左括号入栈,遇到右括号取栈顶元素,看是否同类匹配(都为【】或都为()),匹配则出栈,继...
  • python实现括号匹配

    2021-04-06 15:45:10
    ''' # 存储左括号和右括号 open_brackets = '([{)]}>' # 映射左右括号便于出栈判断 brackets_map = {')': '(', ']': '[', '}': '{', '>': '对于每一行数据,进行如下判定若括号为左括号,加入栈,若括号为右括号,...
  • 字符串--括号序列

    2021-09-12 16:46:16
    括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。 示例1 输入:"[" 返回值:false 示例2 输入:"[]" 返回值:true 解题思路:参考了牛客网上的一个大佬的 要判断括号的有效...
  • php总结基础知识总结 一: 关于php中单引号 双引号 花括号 问题总结在php 中 字符串可以用 单引号 也可以用双引号 引起来表示,输出等。例如:Php代码...
  • —————————————————————— 圆括号()是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理 示例: 1、(abc|bcd|cde),表示这一段是abc、bcd、cde三者之一均可,顺序也必须一致 ...
  • java判断左右括号匹配

    2021-03-17 20:03:43
    java判断左右括号匹配[2021-02-10 16:36:55]简介:Java进行正则表达式匹配的方法:首先打开eclipse软件;然后运用d来进行数字的匹配,如果字符串中遇到了空白字符的话,那么可以运用s进行匹配;接着匹配中括号内的...
  • 输入一个字符串,其中包含[](){}六种括号,请你判断这个字符串组成的括号是否合法。 题目示例 Input: "()[]{}" Output: true Input: "([)]" Output: false Input: "{[]}" Output: true 解题思路 利用堆栈数据...
  • 目录一、 (小括号) 的使用1.1、分组1.2、引用 一、 (小括号) 的使用  它有两个含义: 分组 :子表达式 引用:可以被 捕获 到 1.1、分组  通过代码理解上面两点: // 1.分组 :() // 我们知道{2}量词仅修饰...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 326,275
精华内容 130,510
关键字:

去括号顺序