栈 : 在表尾进行删除和插入操作的线性表
typedef int SElemType;
typedef struct
{
SElemType data[MAXSIZE];
int top;
}SqStack;
Status Push(SqStack *S,SElemType e)
{
if(S->top == MAXSIZE -1)
return ERROR;
S->top++;
S->data[S->top] = e;
return OK;
}
Status Pop(SqStack *S,SElemType *e)
{
if(S->top == MAXSIZE -1 )
return ERROR;
*e = S->data[S->top];
S->top--;
return OK;
}
对于两个相同类型的栈,我们可以做到最大限度地利用事先开辟的存储空间来进行操作
关键思路:他们在数组的两端,向中间靠拢。top1和top2是栈1和栈2的栈顶指针,top1 + 1 = top2时为栈满。
typedef struct
{
SElemType data[MAXSIZE];
int top1;
int top2;
}SqDoubleStack;
Status Push(SqDouble *S,SElemType e,int stackNumber)
{
if(S->top1 + 1 == S->top2)
return ERROR;
if(stackNUmber == 1)
S->data[++S->top1] = e;
else if(stackNumber == 2)
S->data[--S->top2] = e;
return OK;
}
Status Pop(SqDoubleStack *S,SElemType *e,int stackNUmber)
{
if(stackNumber == 1)
{
if(S->top1 == -1)
return ERROR;
*e = S->data[S->top--];
}
else if(stackNumber == 2)
{
if(S->top2 == MAXSZIE)
return ERROR;
*e = S->data[S->top++];
}
}
栈的链式存储结构
对于链栈来说,是不需要头结点的,链栈的空其实就是top = NULL;
链栈的结构
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
进栈操作
Status Push(LinkStack *S,SElemType e)
{
LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
s->data = e;
s->next = S->top;
S->top = s;
S->count++;
return OK;
}
出栈操作
Status Pop(LinkStack *S,SElemType *e)
{
LinkStackPtr p;
if(StackEmpty(*S))
return ERROR;
*e = S->top->data;
p = S->top;
S->top = S->top->next;
free(p);
S->count --;
return OK;
}
用栈来实现表达式中(),[],{}是否匹配
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STACK_MAX_SIZE 50
typedef struct STACK{
char databuf[STACK_MAX_SIZE];
int top;
}STACK;
typedef struct STACK stack;
void initstack(stack *s)
{
s->top = -1;
}
char push(stack *s,char a)
{
if(s->top == STACK_MAX_SIZE - 1)
return 0;
s->top++;
s->databuf[s->top] = a;
return a;
}
char pop(stack *s)
{
if(s->top == -1)
return 0;
char a = s->databuf[s->top];
s->top --;
return a;
}
int empty(stack *s)
{
if(s->top == -1)
return 1;
else
return 0;
}
int check(char *str)
{
stack s;
initstack(&s);
int num = strlen(str);
int i,sig;
sig = 0;//
for(i = 0;i<num;i++)
{
char a=str[i];
int ret;
switch(a)
{
case '{':
case '[':
case '(':
sig++;
push(&s,a);
break;
case '}':
if(pop(&s) != '{')
{
return 0;
}
break;
case ']':
if(pop(&s) != '[')
{
return 0;
}
break;
case ')':
if(pop(&s) != '(')
{
return 0;
}
break;
}
}
int ret = 0;
ret = empty(&s);
if(ret == 1 && sig == 0)
return 2;//empty
else if(ret == 1)
return 1;
else
return 0;
}
void main()
{
char str[100];
scanf("%s",str);
int ret;
ret = check(str);
if(ret == 2)
printf("no []{}()\n");
else if(ret == 1)
printf("match \n");
else
printf("not match\n");
}