多项式括号匹配:

#include <stdio.h>
#include <malloc.h>#define STACK_MAX_SIZE 10//创建栈结构体
typedef struct charStack{int top;int data[STACK_MAX_SIZE];
}*stackPtr; //输出栈
void outputStack(stackPtr paraStack){for(int i=0;i<=paraStack->top;i++){printf("%d ",paraStack->data[i]);}printf("\r\n");
} //初始化栈
stackPtr initStack(){stackPtr tempStack=(stackPtr)malloc(sizeof(stackPtr));tempStack->top=-1;return tempStack;
} //入栈
void push(stackPtr stack,int paraValue){//检查空间if (stack->top >= STACK_MAX_SIZE - 1) {printf("Cannot push element: stack full.\r\n");return;}//update topstack->top++;//添加元素stack->data[stack->top]=paraValue;
} //出栈
int pop(stackPtr stack){// 空间检查 if (stack->top < 0) {printf("Cannot pop element: stack empty.\r\n");return '\0';}//update topstack->top--;//返回栈顶 return stack->data[stack->top+1];
} bool bracketMatch(char *paraString, char paraLength){//初始化创建栈底stackPtr tempStack= initStack();push(tempStack, '#');char tempChar,tempPopedChar;//startfor(int i=0;i<paraLength;i++){tempChar= paraString[i];switch(tempChar){case '(':case '[':case '{':push(tempStack,tempChar);break;case ')':tempPopedChar = pop(tempStack);if (tempPopedChar != '(') {return false;}break;case ']':tempPopedChar = pop(tempStack);if (tempPopedChar != '[') {return false;} break;case '}':tempPopedChar = pop(tempStack);if (tempPopedChar != '{') {return false;} break;default:break;}}tempPopedChar = pop(tempStack);if (tempPopedChar != '#') {return false;} return true;
}void pushPopTest() {printf("---- pushPopTest begins. ----\r\n");// Initialize.stackPtr tempStack = initStack();printf("After initialization, the stack is: ");outputStack(tempStack);// Pop.for (int i = 1; i < 10; i++) {printf("Pushing %d.\r\n", i);push(tempStack, i);outputStack(tempStack);}//Of for i// Pop.int s;for (int j = 0; j< 3; j++) {s = pop(tempStack);printf("Pop %d.\r\n", s);outputStack(tempStack);}//Of for iprintf("---- pushPopTest ends. ----\r\n");
}// Of pushPopTestvoid bracketMatchingTest() {char* tempExpression = "[2 + (1 - 3)] * 4";bool tempMatch = bracketMatch(tempExpression, 17);printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);tempExpression = "( () )";tempMatch = bracketMatch(tempExpression, 6);printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);tempExpression = "(()())";tempMatch = bracketMatch(tempExpression, 6);printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);tempExpression = "({}[])";tempMatch = bracketMatch(tempExpression, 6);printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);tempExpression = ")(";tempMatch = bracketMatch(tempExpression, 2);printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
}// Of bracketMatchingTest/**The entrance.*/
int main() {//pushPopTest();bracketMatchingTest();
}

运行结果:

多项式加法:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include <unordered_map>using namespace std;stack<int> num;
stack<char> op;void eval()
{auto b = num.top();num.pop();auto a = num.top();num.pop();auto c = op.top();op.pop();int x;if (c == '+') x = a + b;else if (c == '-') x = a - b;else if (c == '*') x = a * b;else x = a / b;num.push(x);
}int main()
{unordered_map<char, int> pr{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};string str;cin >> str;for (int i = 0; i < str.size(); i ++ ){auto c = str[i];if (isdigit(c)){int x = 0, j = i;while (j < str.size() && isdigit(str[j]))x = x * 10 + str[j ++ ] - '0';i = j - 1;num.push(x);}else if (c == '(') op.push(c);else if (c == ')'){while (op.top() != '(') eval();op.pop();}else{while (op.size() && op.top() != '(' && pr[op.top()] >= pr[c]) eval();op.push(c);}}while (op.size()) eval();cout << num.top() << endl;return 0;
}

运行结果:

总结:

括号匹配还好,表达式运算确实难到我了,没办法,又分析了一下大佬的代码,总结如下:
当自己在写代码时,总是想到哪里就写到哪里,其实说白了,还是自己的思维逻辑不是很清晰很明了,自己在以后必须多加强自己的思维逻辑训练,不能让自己的思维总是“旋转跳跃”。

数据结构--表达式括号匹配和运算相关推荐

  1. 西北工业大学noj数据结构表达式括号匹配(严3.19)

    这道题要求我们判断输出的一个字符串中的括号是否符合运算规律.可以运用栈的思想.如果一个括号是左括号就入栈,如果输出一个右括号就将它和栈头的左括号对比,符合就出栈(相当于消掉).最后如果还有没消掉的括号 ...

  2. 洛谷——P1739 表达式括号匹配

    P1739 表达式括号匹配 题目描述 假设一个表达式有英文字母(小写).运算符(+,-,*,/)和左右小(圆)括号构成,以"@"作为表达式的结束符.请编写一个程序检查表达式中的左右 ...

  3. P1739表达式括号匹配

    题目描述 假设一个表达式有英文字母(小写).运算符(+,-,*,/)和左右小(圆)括号构成,以"@"作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返 ...

  4. P1739 表达式括号匹配

    题目描述 假设一个表达式有英文字母(小写).运算符(+,-,*,/)和左右小(圆)括号构成,以"@"作为表达式的结束符. 请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则 ...

  5. 表达式括号匹配(信息学奥赛一本通-T1353)

    [题目描述] 假设一个表达式有英文字母(小写).运算符(+,-,*,/)和左右小(圆)括号构成,以"@"作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配, ...

  6. 表达式括号匹配_洛谷1739_栈

    题目背景 你猜 题目描述 假设一个表达式有英文字母(小写).运算符(+,-,*,/)和左右小(圆)括号构成,以"@"作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹 ...

  7. 题解-表达式括号匹配

    描述 假设一个表达式有英文字母(小写).运算符(+,-,*,/)和左右小(圆)括号构成,以"@"作为表达式的结 束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回 ...

  8. 【数据结构】-括号匹配

    问题: 输入一个带有 '(' .')'的字符串,编写程序判断左右括号个数是否匹配. 输入:(4+3)*5/((34+2)-64) 思路: |  若有左括号压入栈中 输入字符串--->遍历各字符- ...

  9. 六十三、栈在括号匹配和表达式求值中的应用

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 算法,一门既不容易入门,也不容易精通的学问. 文章目录 括号匹配 数 ...

最新文章

  1. html5 的a标签是可以拨电话的,通过其Href属性来实现
  2. Kataspace:用HTML5和WebGL创建基于浏览器的虚拟世界
  3. 在Python中实现SVM分类
  4. pytroch 中Variable实现线性回归
  5. 【Angular】双向数据绑定--作用域树
  6. c++中为什么父类名可以直接调用自己的非静态函数测试例子!(父类名::非静态函数)
  7. c语言向文件中写入字符串_C语言中定义字符串的两种方式及其比较
  8. “做好大数据测试,我是认真的!”
  9. (转载)【即时通讯】今天的鼻子一酸的即时通讯
  10. 关于windows注册表
  11. Asp.net WebForm使用codeFirst建立和修改数据库小结
  12. Python模块:配置文件解析器configparser
  13. python虚拟环境--virtualenv
  14. 港台服冒险岛枫之谷传统登录方式密码解密及自动登录方式
  15. 教你修改Win7系统的登录界面背景
  16. combo 口切换配置
  17. 蓝海卓越云AC功能简介
  18. linux:压缩某个文件夹的实现方法
  19. 基于Python实现的决策树模型
  20. 【百度】 快速精准搜索

热门文章

  1. 魔王语言(C语言版)
  2. 数据结构课程设计(魔王语言(c语言)的简单代码)
  3. 世界历史50大著名统治者
  4. 1489. 田忌赛马(贪心)
  5. 来自日本的品质传承 工机控股发布新品牌HiKOKI战略
  6. 支付宝蚂蚁庄园线下支付链接,支付宝蚂蚁庄园线下支付地址
  7. redis-删除所有key
  8. java能不能播放mp4_如何在Java Swing应用程序中播放MP4视频
  9. 藏在GPT背后的治理分歧:那些赞同和反对的人们|AI百态(下篇)
  10. Jupyter Notebook使用过程中的七七八八