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 LEN 80
typedef struct list{
char node;
struct list* next;
}list,*plist;
void iniList(plist);
int isEmpty(plist);
int listAppend(plist,char);
int delBracketsFormList(plist);
int main(int argc,char* argv[]){
char test[LEN];
int i;
list a;
plist p;
p=&a;
iniList(p);
scanf("%80s",test);
for (i=0;i<LEN;i++){
switch(test[i]){
case '[': case']': case'{': case'}': case'(': case')':
listAppend(p,test[i]);
break;
default:continue;
}
}
delBracketsFormList(p);
if (isEmpty(p)){
printf("括号匹配!
");
}
else
printf("括号不配对!
");
return 0;
}
void iniList(plist aplist){
aplist->next=NULL;
aplist->node='\0';
}
int isEmpty(plist aplist){
return aplist->next==NULL?1:0;
}
int listAppend(plist aplist,char a){
plist bplist=aplist,anode;
while (bplist->next){
bplist=bplist->next;
}
anode=(plist)malloc(sizeof(list));
if (!anode)exit(-1);
anode->node=a;
anode->next=NULL;
bplist->next=anode;
return 0;
}
int delBracketsFormList(plist aplist){
plist temp;
int has=1;
if (isEmpty(aplist))
return 0;
while(has){
has=0;
temp=aplist;
while (temp->next){
if(temp->next->next){
if((temp->next->next->node - temp->next->node == 1)||(temp->next->next->node - temp->next->node == 2)){
temp->next = temp->next->next->next;
has=1;
}
else
temp = temp->next;
}
else
temp =temp->next;
if(!has)break;
}
}
return 0;
}
#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 ==rightb)output[i]=1;
else output[i]=0;
lefts=0;
leftm=0;
leftb=0;
rights=0;
rightm=0;
rightb=0;
i++;
}
if(c == '(' )lefts++;
if(c == ')' )rights++;
if(c == '[' )leftm++;
if(c == ']' )rightm++;
if(c == '{' )leftb++;
if(c == '}' )rightb++;
}
n=i;
for(i=0;i<n;i++)
{
if(output[i]==1)printf("yes\n");
else printf("no\n");
}
system("pause");
return 0;
}
这是程序,当输入星号*就结束。不论是否一行只有它。有点不符合题意呃。你可以改改。
上面那个人写的为单行输入。且没有考虑中括号和大括号。
#include <stdio.h>
int main(){
char e[101];
int p=0,i;
int yn;
scanf("%s",e);
while(e[0]!='*'){
yn=1;
for(i=0; yn && e[i]; i++){
if(e[i]=='(')
p++;
else if(e[i]==')')
if(p>0)
p--;
else
yn=0;
}
if(yn && p==0)
printf("yes\n");
else
printf("no\n");
scanf("%s",e);
p=0;
}
return 0;
}
C语言中if(!a)表示什么意思
if( !a )就是一个判断语句,判断表达式 !a 的真假,进而决定是否执行后续操作。如果a是一个变量 当a等于0时,!a=1(为真),执行后续操作;当a不等于0时,!a=0(为假),不执行后续操作;如果a是一个表达式 将表达式的值计算出来,当成变量来操作,判断过程同上。
c语言if语句的用法
c语言提供了三种形式的if语句:1、if(表达式)语句。例如:if(x>y)printf("%d",x);此时,如果表达式为真,则执行printf语句。2、if(表达式)语句1 else 语句2 例如:if(x>y)printf("%d",x);else printf("%d",y);此时,如果x>y成立为真,则执行语句printf("%d",x),然后直接跳过else...
C语言中判断表达式类型
两个不同值域的类型进行运算,结果会自动转换为值域较大的类型。char 1个字节, int,float4个字节,double 8个。更具体的转换关系,就和编译器和c语言版本相关。
C语言 给定的表达式中左右括号数量是否匹配
假定全部都是小括号,int i j 表达式char* ch = "12345((8277)7778"for(int k =0;k<len;K++){ if( ch[k] = 左括号)i++ if( ch[k] = 右括号)j++ } if(i == j) 匹配 否则不匹配
在C语言的if语句中,用做判断的表达式是什么表达式?
d任意表达式 打字不易,如满意,望采纳。
c语言表达式中,写出三个n能被5整除的表达式
以下是三个 C 语言表达式,用于判断一个整数变量 `n` 是否能被 5 整除:1. `n % 5 == 0`这个表达式使用取模运算符 `%` 来计算 n 除以 5 的余数,如果余数为 0,则说明 n 能被 5 整除。2. `(n & 0x07) == 0`这个表达式使用按位与运算符 `&` 将 n 和二进制数 0x07(即二...
C语言中的 (表达式1)?(表达式2):(表达式3) 什么意思?我给忘了~~拜托各...
表达式1一般是判断语句的,如果是true,则返回表达式2,否则返回表达式3。举个列 :(1>2)?1:2 ,因为1<2的,结果是false,所以返回表达式3, (1>0)?2:2, 因为1>0的,结果是true,所以返回表达式2。如果表达式1 的值为真,那么以表达式2 的值作为整个条件表达式的值,否则以表达式3 的值作为...
在c语言中判断一个整数n是偶数的表达式怎样写?
看它被二除的余数是否为0。if ( n%2==0 )
C语言中的的if语句共有多少种格式?
3、第三种形式为if-else-if形式 前二种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else-if语句,一般形式为: if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3;…else if(表达式m) 语句m; else 语句n;其语义是:依次判断表达式...
判断char型变量ch是否为大写字母的c语言表达式
判断char型变量ch是否为大写字母的c语言表达式是ch>='A' && ch<='Z' 。char用于C或C++中定义字符型变量,取值是字符常量,只占一个字节。系统在表示一个char型变量时,是将变量的ASCII码存入内存。取值范围为 -128 ~ +127。所以可以直接用大写字母对应的ASCII码进行判断。即判断char型变量ch是否为...
邸怕枢芬: #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 ==...
蓬江区19838425929: 一道C语言题目:编写程序检查输入的算术表达式中括号是否配对,并显示出结果. - ?
邸怕枢芬: if(c=='(') l++; else if(c==')') r++;if(l==r) printf("yes"); else printf("no");
蓬江区19838425929: 编写程序,判别表达式中左、右括号是否配对 - ?
邸怕枢芬: #include <stdio.h> #include <string.h> void main() { int i,left=0,right=0; char str[100]; printf("请输入一行字符:\n"); gets(str); for( i=0; i<strlen(str); i++) {if(str[i]== '(') left++;if(str[i]== ')') right++; } if(left==right)printf("左、右括号配对\n"); elseprintf("左、右括号不配对\n"); }
蓬江区19838425929: 输入一行表达式,判断该表达式中的括号是否匹配.括号要求符合C++表达式的要求.若左括号与右括号匹配,则 - ?
邸怕枢芬: #include <iostream> using namespace std; #define MAX_SIZE 50 typedef struct {int stack[MAX_SIZE];int top; }Stack; int main() {Stack st;st.top=-1;char ch;bool flag=false;while (cin>>ch){switch (ch){case '(':st.stack[++st.top]=ch;break;...
蓬江区19838425929: C语言 判断括号()是否匹配 - ?
邸怕枢芬: char str[100]; int i, count = 0; gets(str); for (i = 0; str[i] != '\0' && count >= 0; i ++) {switch (str[i]){case '(':count ++;break;case ')':count --;break;} } if (count != 0)printf("error\n"); elseprintf("right\n");
蓬江区19838425929: 急求c语言编写的利用栈检验括号匹配的程序完整代码,谢谢啦~ - ?
邸怕枢芬: 输入:串中只含有'(', ')'两个符号,判断是否括号匹配 并不需要真正的入栈、出栈,用top移动模拟即可 #include <stdio.h> int main() {char s[256], *p;int top = 0;scanf("%s", s); for(p=s; *p; p++){if(*p == '(')++top; //入else --top; //出if(top < 0)break; //无左括号与之匹配}if(!*p && !top)puts("Yes");else puts("No"); }
蓬江区19838425929: C语言编程:输入一位操作数的算术表达式,判断左括号与右括号是否匹配,并计算 - ?
邸怕枢芬: 先按顺序取出所有的括号.然后循环删除_相邻的_差为一或二的_点.最后如果表空则匹配. 单向链表: #include#include#include#define LEN 80 typedef struct list{ char node; struct list* next; }list,*plist; void iniList(plist); int isEmpty(plist); int ...
蓬江区19838425929: 用C++试写一个判别表达式中开括号是否配对出现的算法 - ?
邸怕枢芬: 顺序遍历表达式 左半边括号 找到就压栈 右半括号就退栈 如果最后栈是空的那么就匹配既然已经说出算法了 楼主不会实现 也不是我的问题了
蓬江区19838425929: 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<...
蓬江区19838425929: 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 ) //遇到)就要...