C数据结构-栈
Posted 为了维护世界和平_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C数据结构-栈相关的知识,希望对你有一定的参考价值。
栈 : 在表尾进行删除和插入操作的线性表
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");
以上是关于C数据结构-栈的主要内容,如果未能解决你的问题,请参考以下文章