从数据结构角度看,栈和队列也是线性表,只不过是操作受限的线性表。
栈:只允许在一端进行插入和删除操作的线性表,允许操作的一端为栈顶,不允许操作的一段称之为栈底。
栈顶是表尾,栈底是表头。
1.栈的特点
后进先出(LIFO)
先进后出(FILO:first in last out)
存储:顺序存储、链式存储
2.栈的描述
**描述:**数组+top指针
#define MAXSIZE 32
typedef int datatype;
typedef struct
{
datatype data[MAXSIZE];
int top;//栈顶,允许操作的一端
}seqstack;
3.基本操作
3.1创建空顺序栈
seqstack * createSeqStack()
{
seqstack * s = (seqstack *)malloc(sizeof(seqstack));
if(NULL == s)
{
printf("create: malloc fail\n");
return NULL;
}
s->top = -1;
return s;
}
3.2判空
int isEmpty(seqstack * s)
{
return (s->top == -1)? 1:0;
}
3.3判满
int isFull(seqstack * s)
{
return (s->top == MAXSIZE-1)? 1:0;
}
3.4入栈
int pushSeqstack(seqstack * s, datatype x)
{
//1.栈不为满则入
if(isFull(s))
{
printf("栈已满\n");
return -1;
}
//2.入栈
s->top++;
s->data[s->top] = x;
return 0;
}
3.5出栈
int popSeqstack(seqstack * s, datatype *x)
{
//1.栈不空则出栈
if(isEmpty(s))
{
printf("栈为空\n");
return -1;
}
//2.出栈
*x = s->data[s->top];
s->top--;
return 0;
}
4.应用——数制转换
将十进制123转换为二进制
unsigned int i = 123;
datatype x;
seqstack * s = createSeqStack();
if(NULL == s)
return -1;
//入栈
while(i)
{
if(!isFull(s))
pushSeqstack(s, i%2);
i = i/2;
}
//出栈
while(!isEmpty(s))
{
popSeqstack(s, &x);
printf("%d ", x);
}
printf("\n");