使用栈感想:判断栈空与否的条件应该写成stack->top->next!=NULL,不容易出错
附上括号匹配的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct list{
char num;
struct list*next;
}list;
typedef struct stack{
list*top;
list*bottom;
}stack;
void init(stack*pstack){
pstack->bottom=(list*)malloc(sizeof(list));
if(pstack->bottom==NULL){
printf("内存分配失败");
}
else{
pstack->top=pstack->bottom;
pstack->bottom->next=NULL;
}
}
void push(stack*pstack,char value){
list*pnew=(list*)malloc(sizeof(list));
pnew->num=value;
pnew->next=pstack->top;
pstack->top=pnew;
}
void pop(stack*pstack){
list*p;
p=pstack->top;
pstack->top=pstack->top->next;
free(p);
}
int main(){
stack*s;//s就是栈
s=(stack*)malloc(sizeof(stack));
char a[100];
char sign[30];
scanf("%s",a);
int i=0;
int j=0;
for(i=0;i<strlen(a);i++){
if(a[i]=='{'||a[i]=='['||a[i]=='('||a[i]=='}'||a[i]==']'||a[i]==')'){
sign[j]=a[i];
j++;
}
}
init(s);
int k=0;//k用来避免匹配失败还输出匹配成功
for(i=0;i<strlen(sign);i++){
//压栈操作
if(sign[i]=='{'||sign[i]=='['||sign[i]=='('){
push(s,sign[i]);
}
//出(括号
if(sign[i]==')'){
if(s->top->num=='('){
pop(s);
}
else{
k++;
printf("缺少(括号");
}
}
//出【括号
if(sign[i]==']'){
if(s->top->num=='['){
pop(s);
}
else{
k++;
printf("缺少[括号");
}
}
//出{括号
if(sign[i]=='}'){
if(s->top->num=='{'){
pop(s);
}
else{
k++;
printf("缺少{括号");
}
}
}
if(s->top->next!=NULL){
printf("缺少}括号");
}
else if(s->top==s->bottom&&k==0){
printf("匹配成功");
}
return 0;
}