C语言 给定的表达式中左右括号数量是否匹配
这个很简单的,不需要用栈,只要按楼上那位用k的++和--来表示就可以了,要注意k不能小于0。 发给你一个代码吧,前几天写的表达式演算的,不仅仅是匹配括号,可以直接演算四则运算的表达式,按算术优先级和括号顺序演算结果,拿去体验一下吧。 #include
#include
typedef struct type {
int data;
struct type* ptr;
} stacknode, *stack;void push(stack* obj, int data) {
stack temp = *obj;
*obj = malloc(sizeof(stacknode));
(*obj)->data = data;
(*obj)->ptr = temp;
}int pop(stack* obj, int* data) {
stack temp;
if(*obj == 0)
return -1;
temp = (*obj)->ptr;
*data = (*obj)->data;
free(*obj);
*obj = temp;
return 0;
}int operate(int x, int op, int y) {
switch(op) {
case (int)'+':
return x + y;
case (int)'-':
return x - y;
case (int)'*':
return x * y;
case (int)'/':
return x / y;
}
return 0;
}int op_to_int(int op) {
switch(op) {
case (int)'*':
return 2;
case (int)'/':
return 2;
case (int)'+':
return 1;
case (int)'-':
return 1;
}
return 0;
}int op_cmp(int op1, int op2) {
int op1_int = op_to_int(op1);
int op2_int = op_to_int(op2);
if(op1_int == 0 || op2_int ==0)
return -1;
if(op1_int >= op2_int)
return 1;
return 0;
}int main()
{
int rst;
int temp;
int data = 0;
stack OPND = 0;
stack OPTR = 0;
int a, op, b;
while(temp = getc(stdin)) {
if(temp >= (int)'0' && temp <= (int)'9') {
data = data * 10 + (temp - (int)'0');
}
else {
if(temp != (int)'(') {
push(&OPND, data);
data = 0;
}
if(temp == (int)'+' ||
temp == (int)'-' ||
temp == (int)'*' ||
temp == (int)'/') {
if(OPTR == 0 || OPTR->data == (int)'(') {
push(&OPTR, temp);
}
else {
int cmp = op_cmp(OPTR->data, temp);
if(cmp == -1) {
printf("input error!1
");
printf("%c %c
", OPTR->data, temp);
return -1;
}
else if(cmp == 1) {
if((pop(&OPND, &a)) == -1) {
printf("input error!2
");
return -1;
}
if((pop(&OPND, &b)) == -1) {
printf("input error!3
");
return -1;
}
if((pop(&OPTR, &op)) == -1) {
printf("input error!4
");
return -1;
}
push(&OPTR, temp);
push(&OPND, operate(b, op, a));
}
else if(cmp == 0) {
push(&OPTR, temp);
}
}
}
else if(temp == (int)')') {
while(1) {
if((pop(&OPND, &a)) == -1) {
printf("input error!5
");
return -1;
}
if((pop(&OPND, &b)) == -1) {
printf("input error!6
");
return -1;
}
if((pop(&OPTR, &op)) == -1) {
printf("input error!7
");
return -1;
}
data = operate(b, op, a);
if((pop(&OPTR, &op)) == -1) {
printf("input error!8
");
return -1;
}
if(op != (int)'(') {
push(&OPND, data);
push(&OPTR, op);
}
else {
break;
}
}
}
else if(temp == (int)'(') {
push(&OPTR, temp);
data = 0;
}
else if(temp == (int)'
') {
break;
}
else {
printf("input error! real error
");
return -1;
}
}
}
while(OPTR != 0) {
if((pop(&OPND, &a)) == -1) {
printf("input error!10
");
return -1;
}
if((pop(&OPND, &b)) == -1) {
printf("input error!11
");
return -1;
}
if((pop(&OPTR, &op)) == -1) {
printf("input error!12
");
return -1;
}
push(&OPND, operate(b, op, a));
}
pop(&OPND, &rst);
printf("the result is:%5d
", rst);
return 0;
}
由于没有分配空间,,,修改如下
#include
#include
#include // !!!分配内存头文件
#define m 20
typedef char ElemType;
typedef struct
{
ElemType stack[m];
int top;
}stacknode;
stacknode *sp;
Init(stacknode *st)
{
st->top=0;
return 0;
}
void Push(stacknode *st,ElemType x)
{
if(st->top==m)
printf("The stack is overflow!
");
else
{
st->top=st->top+1;
st->stack[st->top]=x;
}
}
void Pop(stacknode *st)
{
st->top=st->top-1;
}
main()
{
char s[m];
int i;
printf("Creat a stack!
");
sp = (stacknode *)malloc(sizeof(stacknode)); // !!!添加的语句
Init(sp);
printf("Input a expression:
");
gets(s);
for(i=0;i<strlen(s);i++)
{
if(s[i]=='(')
Push(sp,s[i]);
if(s[i]==')')
Pop(sp);
}
if(sp->top==0)
printf("左右括号是匹配的!
");
else
printf("左右括号是不匹配的!
");
}
表达式char* ch = "12345((8277)7778"
for(int k =0;k<len;K++)
{
if( ch[k] = 左括号)i++
if( ch[k] = 右括号)j++
}
if(i == j) 匹配
否则不匹配
左边有几个,右边不就有几个吗,统计匹配很简单,是分析逻辑比较复杂
定义一个int
k=1;
当遇到(左括号的时候k++,
右括号的时候k--,
如果k==0(if(!k))
则说明不匹配。
吁鸿沉香: #include <stdio.h> #include <stdlib.h>int main(int argc, char *argv[]) {char c;int i=0,n;int output[100];int lefts=0,leftm=0,leftb=0;int rights=0,rightm=0,rightb=0;while((c=getchar())!='*'){if(c=='\n'){if(lefts == rights && leftm == rightm && leftb ==...
澄江县13870872773: c程序设计中的括号匹配 问题描述 1.设某一算术表达式中包含圆括号、方括号和花括号三种类型的括号,编 - ?
吁鸿沉香: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50#include <iostream> #include <string> #include <stack>boolmatch(conststd::string & s);intmain() ...
澄江县13870872773: C语言中代码规范问题:表达式的大括号的左大括号写在哪比较规范?如下有两种,大家给给意见. - ?
吁鸿沉香: 这是两种不同的风格,并没有更规范一说有的大牛认为第一种比较好 有的大牛认为第二种比较好 争来争去,这个不会有最终结论的.你习惯那种就使用那种就可以了,如果你是和别人一个团队进行开发,随着团队的风格来就可以了.
澄江县13870872773: C语言括号匹配问题 - ?
吁鸿沉香: #include<stdio.h> int main() { int n,j,i; scanf("%d",&n); for(;n>0;n--) { char s[1000]={0}; //不超过1000表示最示最大1000个字符,要给\0留个位置 scanf("%s",s); j=0; //j每次都要在这里赋初值0 for(i=0;s[i];i++) { if(s[i]==')') { j--; if ( j<0 ) //遇到)就要...
澄江县13870872773: 求一个用C语言编的括号匹配的实验 - ?
吁鸿沉香: main() {char a[500]; int i,n,x=0,y=0; gets(a); n=strlen(a); for(i=0;i<n;i++) if(a[i]=='(') x++; else if(a[i]==')') y++; if(x<y||x>y) printf("bu pi pei \n"); else printf(kuo hao pi pei ); return; } 大概就是这样,你自己运行一下,也许有语法错误!
澄江县13870872773: C语言中,int a=5,b=4;printf("%d",(a++,b -- )); 括号里面什么 - ?
吁鸿沉香: 你好: 你指的括号里其实为逗号运算符,它是C语言中优先级最低的运算符,一般用法就是(a,b,c,…),这个逗号表达式的值永远为括号中最后一个数量的值,所以printf函数只有一个%d. 而输出呢,虽然看似为b--,但是这是后自减,就是对b进行输出后再减1. 有不懂的地方随时回复我. 希望我的回答能帮助到你.
澄江县13870872773: [C语言][表达式计算][逗号表达式]表达式计算顺序的疑问 - ?
吁鸿沉香: 首先我们看一下你的表达式b=a+(a=0,1);等式右边算完值后赋值给左边,而右边的表达式括号优先级最高,所以先算括号里面的逗号表达式,看看下面的解释:“c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两式联接起来...
澄江县13870872773: c语言括号配对问题 - ?
吁鸿沉香: #include#include int isPair(char *s) { int i,j=0,k=0; for(i=0;s[i]!='\0';i++) { if(s[i]=='(') j++; if(s[i]==')') k++; } if(j==k) return 1; return 0; } int main() { int n; char *s; scanf("%d",&n); s=(char*)malloc((n+1)*sizeof(char)); scanf("%s",s); if(isPair(s)) printf("...
澄江县13870872773: C语言编程:输入一位操作数的算术表达式,判断左括号与右括号是否匹配,并计算 - ?
吁鸿沉香: 先按顺序取出所有的括号.然后循环删除_相邻的_差为一或二的_点.最后如果表空则匹配. 单向链表: #include#include#include#define LEN 80 typedef struct list{ char node; struct list* next; }list,*plist; void iniList(plist); int isEmpty(plist); int ...
澄江县13870872773: c语言 括号 - ?
吁鸿沉香: 逗号分隔的各个表达式会从左到右依次计算,先算a=i+1=5+1=6,然后算a+2,结果为8,但a本身的值仍然是6,接着算a+3,结果为9,括号中的各个表达式,最后向左边的a进行赋值时,只取最后一项也就是a+3,所以最后a的值为9