栈
##顺序栈的定义
- 栈是一种先进后出的结构,属于一种线性结构
- 栈顶指针用于控制数据的压入与弹出
- 当栈为空时top == -1
#define max 20
typedef struct
{
int data[20];
int top;
}stack;
##顺序栈的压入与弹出
int push(stack *p , int data)
{
if (p ->top == max - 1) return 0;
p ->top ++;
p ->data[p->top] = data;
return 1;
}
int pop (stack *p, int *s)
{
if (p ->top == -1) return 0;
*s = p ->data[p->top];
p->top --;
return 1;
}
俩个顺序栈共享一个数组空间的实现
###存储
- top1是第一个栈的头指针,top2是第二个栈的头指针
- top1为-1时,表示第一个栈为空, top2为max时,表示第二栈为空
- top1 + 1 == top2 表示栈已经满了
#define max 20
typedef struct
{
int data [max];
int top1;
int top2;
}doublestack;
弹入与压出
int push (doublestack *p , int data , int number)
{
if (p->top1 + 1 == p->top2) return 0;
if (number == 1){
p->data[++ p->top1] = data;
}
else{
p->data[-- p->top2] = data;
}
return 1;
}
int pop(doublestack *p , int *data , int number)
{
if (number == 1){
if (p->top1 == -1) return 0;
else {
*data = p->data[p->top1 --];
}
}
else {
if (p->top2 == max) return 0;
else {
*data = p->data[p->top2 ++];
}
}
return 1;
}
链式栈
储存
typedef struct node
{
int data;
struct node *next;
}stacknode , *linkstackptr;
struct linkstack
{
linkstackptr top;
int count;
};
###压入与弹出
- 弹出与压入的方式与链表的操作类似,将头指针看作栈顶指针
- 不存在头结点
void push (linkstack *p , int data)
{
linkstackptr newnode = (linkstackptr)malloc(sizeof(stacknode));
newnode->data = data;
newnode->next = p->top;
p->top = newnode;
p->count ++;
}
int pop (linkstack *p , int *data)
{
linkstackptr temp;
if (p->top == NULL) return ;
*data = p->top->data;
temp = p->top;
p->top = p->top->next;
free(temp);
p->count --;
return 1;
}