从数据结构角度看,栈和队列也是线性表,只不过是操作受限的线性表。
栈:只允许在一端进行插入和删除操作的线性表,允许操作的一端为栈顶,不允许操作的一段称之为栈底。
栈顶是表尾,栈底是表头。
1.栈的特点
后进先出(LIFO)
先进后出(FILO:first in last out)
存储:顺序存储、链式存储
2.链栈的描述
描述: 数组+next指针
typedef int datatype;
typedef struct node
{
datatype data;
struct node * next;
}linkstack;
3.基本操作
3.1创建空链栈
linkstack * createLinkStack()
{
linkstack * s = (linkstack *)malloc(sizeof(linkstack));
if(NULL == s)
{
printf("create: malloc fail\n");
return NULL;
}
s->data = -1;
s->next = NULL;
return s;
}
3.2判空
链式存储无需判满
int isEmpty(linkstack * s)
{
return (s->next == NULL)?1:0;
}
3.3入栈
入栈是在栈顶,所以采用头插法
int pushLinkStack(linkstack *s, datatype x)
{
//1.封装新结点
linkstack * pnew = (linkstack *)malloc(sizeof(linkstack));
if(NULL == pnew)
{
printf("push: malloc new node fail\n");
return -1;
}
pnew->data = x;
//头插
pnew->next = s->next;
s->next = pnew;
return 0;
}
3.4出栈
入栈和出栈的位置一样,都固定在头部结点
int popLinkStack(linkstack * s, datatype * x)
{
//1.链栈不为空则出栈
if(isEmpty(s))
{
printf("栈已空");
return -1;
}
//2.出头结点后面的那个结点
linkstack * p = s->next;
s->next = p->next;
*x = p->data;
free(p);
p = NULL;
return 0;
}
4.应用——数制转换
将十进制123转换为二进制
unsigned int i = 123;
datatype x;
linkstack * s = createLinkStack();
if(NULL == s)
{
return -1;
}
//入栈
while(i)
{
pushLinkStack(s, i%2);
i = i/2;
}
//出栈
while(!isEmpty(s))
{
popLinkStack(s, &x);
printf("%d ", x);
}
printf("\n");