69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include "Stack.h"
//栈的顺序存储表示
Status InitStack(Sqstack *L)
{
//构造一个空栈
(*L).base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!(*L).base) exit(ERROR);
(*L).top = (*L).base;
(*L).stacksize = STACK_INIT_SIZE;
return OK;
}//InitStack
//销毁栈
Status DestroyStack(Sqstack *L)
{
if((*L).top == (*L).base) return ERROR;
free((*L).base);
/*
调用malloc函数时,系统会自动记住该空间的起始地址及大小,
释放free时只需要将起始空间告诉系统
*/
(*L).base = NULL;
return 0;
}
//清空栈
Status ClearStack(Sqstack *L)
{
(*L).top = (*L).base;
return 0;
}
//判断栈是否为空
Status IsEmpty(Sqstack *L)
{
if((*L).top == (*L).base)
return TRUE;
else
return FALSE;
}
//返回栈的长度
Status StackLength(Sqstack *L)
{
if((*L).top != (*L).base)
return (*L).top - (*L).base;
}
//用e返回栈顶元素
Status GetTop(Sqstack *L,SElemType *e)
{
if((*L).top != (*L).base)
*e = *((*L).top - 1);
return 0;
}
//插入元素为e的新元素
Status Push(Sqstack *L,SElemType e)
{
if((*L).top - (*L).base >= (*L).stacksize)
{
(*L).base = (int *)realloc((*L).base, ((*L).stacksize + STACKINCREMENT) * sizeof(int));
if(!(*L).base)
return ERROR;
(*L).stacksize += STACKINCREMENT;
}
*((*L).top) = e;
(*L).top++;
return 0;
}
//
Status Pop(Sqstack *L,SElemType *e)
{
if((*L).top == (*L).base)
return ERROR;
*e = *(--(*L).top);
return OK;
}
//遍历栈中的元素
Status StackTravers(Sqstack *L,void(* vi)(SElemType))
{
if((*L).top == (*L).base)
return ERROR;
while((*L).top > (*L).base)
{
vi(*(*L).base);
(*L).base++;
}
return 0;
}
//算法3.1数制转换
void conversion()
{
Sqstack s;
int mod,n,e;
InitStack(&s);//初始化栈
scanf("%d",&n);//等待用户输入
//printf("%d",n);
while(n)//进行8进制的转换
{
mod = n % 8;
n = n/ 8;
Push(&s,mod);
}
while(!IsEmpty(&s))//输出结果
{
Pop(&s,&e);
printf("%d\n",e);
}
printf("\n");
}
//算法3.2.2括号匹配检验
Status check()
{
Sqstack s;
char ch[80],*p,e,g;
if(InitStack(&s))//初始化栈成功
{
printf("请输入一个表达式:\n");
gets(ch);
p = ch;
while(*p)//没有到串尾
switch(*p)
{
case '(':
case '[':
Push(&s,*p++);
break;//左括号入栈,且p++
case ')':
case ']':
printf("%c\n",*p);
printf("1\n");
if(!IsEmpty(&s))//栈不空
{
Pop(&s,&e);//弹出栈顶元素
printf("%c\n",e);
printf("%c\n",*p);
if(*p== ')'&& e!='('||*p== ']'&& e!= '[')//弹出的栈顶元素与括号不匹配,此处判别式有问题
{
printf("左右括号不匹配\n");
exit(ERROR);
}
else
{
p++;
break;
}
} else
{
printf("缺乏左括号\n");
exit(ERROR);
}
default: p++;//其他字符不处理,指针后移
}
}
if(IsEmpty(&s))//字符串结束时栈空
printf("括号匹配\n");
else
printf("右括号不匹配\n");
}
int main()
{
check();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 32
#define STACKINCREMENT 10
#define TRUE 1
#define FALSE 0
typedef char SElemType;
typedef struct node {
SElemType *base;
SElemType *top;
int stacksize;
}Sqstack;
typedef enum ret {
ERROR = -1,
OK = 0,
}Status;
//栈的顺序存储表示
Status InitStack(Sqstack *L)
{
//构造一个空栈
(*L).base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!(*L).base)
exit(ERROR);
(*L).top = (*L).base;
(*L).stacksize = STACK_INIT_SIZE;
return OK;
}
Status DestroyStack(Sqstack *L)
{
if((*L).top == (*L).base)
return ERROR;
free((*L).base);
(*L).base = NULL;
return OK;
}
//清空栈
Status ClearStack(Sqstack *L)
{
(*L).top = (*L).base;
return OK;
}
//判断栈是否为空
int IsEmpty(Sqstack *L)
{
if((*L).top == (*L).base)
return TRUE;
else
return FALSE;
}
int StackLength(Sqstack *L)
{
if((*L).top != (*L).base)
return (*L).top - (*L).base;
else
return 0;
}
Status GetTop(Sqstack *L,SElemType *e)
{
if((*L).top != (*L).base)
*e = *((*L).top - 1);
return OK;
}
//插入元素为e的新元素
Status Push(Sqstack *L,SElemType e)
{
if((*L).top - (*L).base >= (*L).stacksize)
{
(*L).base = (char *)realloc((*L).base, ((*L).stacksize + STACKINCREMENT) * sizeof(char));
if(!(*L).base)
return ERROR;
(*L).stacksize += STACKINCREMENT;
}
*((*L).top) = e;
(*L).top++;
return OK;
}
Status Pop(Sqstack *L,SElemType *e)
{
if (!IsEmpty(L))
*e = *(--L->top);
return OK;
}
//遍历栈中的元素
Status StackTravers(Sqstack *L, void(* vi)(SElemType))
{
if((*L).top == (*L).base)
return ERROR;
while((*L).top > (*L).base)
{
vi(*(*L).base);
(*L).base++;
}
return 0;
}
#if 0
//算法3.1数制转换
void conversion()
{
Sqstack s;
int mod,n,e;
InitStack(&s);//初始化栈
scanf("%d",&n);//等待用户输入
//printf("%d",n);
while(n)//进行8进制的转换
{
mod = n % 8;
n = n/ 8;
Push(&s,mod);
}
while(!IsEmpty(&s))//输出结果
{
Pop(&s,&e);
printf("%d\n",e);
}
printf("\n");
}
#endif
//算法3.2.2括号匹配检验
Status check()
{
Sqstack s;
char ch[80], *p, e;
if(!InitStack(&s))//初始化栈成功
{
printf("请输入一个表达式:\n");
fgets(ch, 80, stdin);
p = ch;
while (*p)//没有到串尾
switch(*p) {
case '(':
case '[':
Push(&s,*p++);
break;
case ')':
case ']':
if(!IsEmpty(&s)) {
Pop(&s,&e);
if((*p == ')' && e!='(')|| (*p== ']'&& e!= '[')) {
printf("左右括号不匹配\n");
exit(ERROR);
} else {
p++;
break;
}
} else {
printf("缺乏左括号\n");
exit(ERROR);
}
break;
default:
p++;
}
}
if(IsEmpty(&s))//字符串结束时栈空
printf("括号匹配\n");
else
printf("右括号不匹配\n");
return OK;
}
int main()
{
check();
return 0;
}