第一题为括号匹配问题。只要() {} []的数量对就可以,不用讨论)(这种问题。
#include<stdio.h>
#include<string.h>
int main(){
char a[51];
int l=0;
int m=0;
int n=0;
int i;
scanf("%s",a);
int len=strlen(a);
for(i=0;i<len;i++){
if(a[i]=='('){
l++;
}
else if(a[i]=='['){
m++;
}
else if(a[i]=='{'){
n++;
}
if(a[i]==')'){
l--;
}
else if(a[i]==']'){
m--;
}
else if(a[i]=='}'){
n--;
}
}
if(l!=0){
printf("1,");
}
if(m!=0){
printf("2,");
}
if(n!=0){
printf("3,");
}
if(l==0 && m==0 && n==0){
printf("0");
}
return 0;
}
遇见([{让对应的存括号数量的变量加一遇见)]}让其减一。
第二题,为中缀表达式转后缀表达式并计算的问题。
这个问题就要涉及到栈的应用。计算机在计算表达式的时候也是计算后缀表达式。这道题的思路就是。遇见数字无条件放入输入数组中。遇见(无条件进栈,遇见)就弹栈,将()里的所有运算符弹出,直到遇见(,将(弹出。接下来讨论运算符的优先级,如果新的运算符的优先级高于栈顶的优先级则入栈,如果优先级低或同一优先级则将栈顶元素弹出直到栈为空或遇见(则压入元素。最后如果栈内还有符号剩余就一个一个记录,弹出。最后将输出数组输出就可以了。
接下来讨论计算的问题。
首先遍历存后缀表达式的数组,如果遇见数字无条件压入栈内,如果遇见符号则将栈顶的前两个元素弹出并进行运算,再把结果压入栈内。最后输出栈顶。
#include<stdio.h>
#include<string.h>
struct stack{
char data[100];
int top;
}stack;
struct stacks{
float num[100];
int top;
}stacks;
void Init(struct stack *s){
s->top=-1;
}
void Inits(struct stacks *s){
s->top=-1;
}
void push(struct stack *s,char a){
s->top++;
s->data[s->top]=a;
}
void pop(struct stack *s){
s->data[s->top]='\0';
s->top=s->top-1;
}
void pushs(struct stacks *s,float a){
s->top++;
s->num[s->top]=a;
}
void pops(struct stacks *s){
s->num[s->top]='\0';
s->top=s->top-1;
}
char getTop(struct stack *s){
return s->data[s->top];
}
float getTops(struct stacks *s){
return s->num[s->top];
}
void trans(struct stack *s,char* a,char* ans){
int i;
int j=0;
int len=strlen(a);
for(i=0;i<len;i++){
if(a[i]<='9' && a[i]>='0'){
ans[j]=a[i];
j++;
}
else{
if(a[i]=='('){
push(s,a[i]);
}
else if(a[i]==')'){
while(getTop(s)!='('){
ans[j]=getTop(s);
j++;
pop(s);
}
pop(s);
}
else if(a[i]=='*' || a[i]=='/'){
while(getTop(s)=='*' || getTop(s)=='/'){
ans[j]=getTop(s);
j++;
pop(s);
}
push(s,a[i]);
}
else if(a[i]=='+' || a[i]=='-'){
while(s->top!=-1 && getTop(s)!='('){
ans[j]=getTop(s);
j++;
pop(s);
}
push(s,a[i]);
}
}
}
while(s->top!=-1){
ans[j]=getTop(s);
j++;
pop(s);
}
}
float calculate(struct stacks *s,char *ans){
Inits(s);
int i;
float a,b;
float c;
int len=strlen(ans);
for(i=0;i<len;i++){
if(ans[i]<='9' && ans[i]>='0'){
pushs(s,ans[i]-'0');
}
else{
if(ans[i]=='+'){
a=getTops(s);
pops(s);
b=getTops(s);
pops(s);
c=a+b;
pushs(s,c);
}
else if(ans[i]=='-'){
a=getTops(s);
pops(s);
b=getTops(s);
pops(s);
c=b-a;
pushs(s,c);
}
else if(ans[i]=='*'){
a=getTops(s);
pops(s);
b=getTops(s);
pops(s);
c=a*b;
pushs(s,c);
}
else if(ans[i]=='/'){
a=getTops(s);
pops(s);
b=getTops(s);
pops(s);
c=b/a;
pushs(s,c);
}
}
}
return s->num[0];
}
int main(){
struct stack s;
struct stacks s2;
int i;
Init(&s);
char a[100],ans[100] = {0};
scanf("%s", a);
trans(&s, a, ans);
int len=strlen(ans);
printf("%.2f\n",calculate(&s2,ans));
for(i=0;i<len;i++){
printf("%c ",ans[i]);
}
return 0;
}