求指点迷津,代码是否有问题是否规范
#include
#define SIZE 8
typedef char element;
typedef struct{
element data[StackSize+1];//0号位不存储
int base;
int top;
}stack;
stack* createstack(stack *S);//构造栈
int push(stack* S, element e);//入栈
int pop(stack* S, element *e);//出栈
int length(stack* S);//若栈存在,求长度
int main(int argc, char* argv[]) {
char brace[SIZE];//存储用户输入
char ch;//读取输入
int i;//记录输入的元素
stack p;
stack * Data = &p;
createstack(Data);
printf("输入括号(),{}.[],#结束\n");
for (i = 0; i < SIZE; i++) {
scanf("%c", &ch);
if (ch == '#') break;
brace[i] = ch;
}
for (int j = 0; j < i; j++) {
if (brace[j] == '(' || brace[j] == '{' || brace[j] == '[') {
push(Data, brace[j]);
}
}
if (!length(Data)) {
printf("栈空,匹配失败\n");
return 0;
}
int index = 0;
for (int j = 0; j < i; j++) {
if (brace[j] == ')' || brace[j] == '}' || brace[j] == ']') {
pop(Data, &ch);
if (ch == '(' && brace[j] == ')') {
index = 1;
}
else if (ch == '{' && brace[j] == '}') {
index = 1;
}
else if (ch == '[' && brace[j] == ']') {
index = 1;
}
else {
index = 0;
}
}
}
if (length(Data)) {//使用求长度判断栈内是否有元素
printf("匹配失败\n");
return 0;
}
if (index) printf("匹配成功");
else printf("匹配失败");
return 0;
}
stack* createstack(stack* S){
S->data[0] = 0;
S->top = 1;
S->base = 1;
return S;
}
int push(stack* S, element e) {
if (S == NULL) {
printf("栈不存在\n");
return 0;
}
if (S->top - S->base == StackSize) {//栈满
return 0;
}
S->data[S->top] = e;
S->top++;
return 1;
}
int pop(stack* S, element *e) {
if (S == NULL) {
printf("栈不存在\n");
return 0;
}
if (S->top == S->base) {
printf("栈空\n");
return 0;
}
S->top--;
*e = S->data[S->top];
return 1;
}
int length(stack* S) {
return S->top -1;//栈空,base = top = 1,则长度为0
}
仅供参考:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_INIT_SIZE 10
#define STACK_GROW_SIZE 5
#define ELEMTYPE char
#define OK 1
#define ERROR 0
typedef struct { /*建立一个栈的首结点*/
ELEMTYPE * base;
ELEMTYPE * top;
int stacksize;
} SpStack;
int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/
s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));
if (!s->base) return ERROR;
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
int StackEmpty(SpStack *s) { /*判断栈是否为空*/
if (s->top==s->base) return OK;
else return ERROR;
}
int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/
if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));
if (!s->base) return ERROR;
s->stacksize+=STACK_GROW_SIZE;
s->top=s->base+s->stacksize;
}
*s->top++=e;
return OK;
}
int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/
if (StackEmpty(s)) return ERROR;
*e=*(--s->top);
return OK;
}
int Comp(ELEMTYPE a,ELEMTYPE b) {
if ((a=='('&&b!=')')
||(a=='['&&b!=']')
||(a=='{'&&b!='}')) {
return ERROR;
} else return OK;
}
int Count(SpStack *s) {
ELEMTYPE e[STACK_INIT_SIZE*2];
ELEMTYPE e1;
int i;
InitStack(s);
fgets(e,STACK_INIT_SIZE*2,stdin);
if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;
printf("%s\n",e);
for (i=0;e[i]!='\0';i++) {
switch (e[i]) {
case '(':
case '[':
case '{':
Push(s,e[i]);
break;
case ')':
case ']':
case '}':
if (StackEmpty(s)) {
printf("%*s↖右括号多余\n",i+1,"");
return(ERROR);
} else Pop(s,&e1);
if (!Comp(e1,e[i])) {
printf("%*s↖左右匹配出错\n",i+1,"");
return(ERROR);
}
}
}
if (!StackEmpty(s)) {
printf("%*s↖左括号多余\n",i,"");
return(ERROR);
} else {
printf("匹配正确\n");
return(OK);
}
}
void main() {
SpStack s;
Count(&s);
free(s.base);
}