栈总结(c语言数组和链表实现)
什么是栈,先进后出,是限定仅在表尾进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端为栈底,不含任何元素的称为空栈。注意栈元素具有线性关系,即前驱后继,最先进栈的元素不一定最后出栈。
栈的顺序存储结构
结构定义
#define MAXSIZE 5
typedef struct sqstack {
int data[MAXSIZE];
int top;//栈顶指针,不是指针类型
};
进栈操作
int main(void) {
sqstack* s = (sqstack*)malloc(sizeof(sqstack));//申请指定空间的栈
s->top = -1;
sqpush(&s,1);//传不传指针都行,改变的是s的内部不是s自身
printf("%d", s->data[0]);
return 0;
}
void sqpush(sqstack** s, int x) {
if ((*s)->top == MAXSIZE - 1) {
printf("OverFlow");
return 0;
}
(*s)->top++;
(*s)->data[(*s)->top] = x;
}
出栈
void spop(sqstack* s) {
if (s->top == - 1) {
printf("OverFlow");
}
else {
s->top--;
}
}
链表实现
入栈
void spush(STACK** stack, int x) {//入栈
if (stack == NULL) {
printf("需要先创建stack!");
exit(-1);
}
else{
LinkStack* newnode = (LinkStack*)malloc(sizeof(LinkStack));
newnode->next = NULL;
newnode->data = x;
newnode->next = (*stack)->top;
(*stack)->top = newnode;
}
}
void Printf(STACK* stack) {//打印栈
LinkStack* newnode;
if (stack->top == NULL) {
printf("空栈!");
exit(-1);
}
else {
newnode = stack->top;
do {
printf(" %d ", newnode->data);
newnode = newnode->next;
} while (newnode != NULL);
}
printf("\n");
}
出栈
void sppop(STACK** stack) {
int x;//保存值
LinkStack* newnode;//释放的
if (stack == NULL || (*stack)->top == NULL) {
printf("空栈!");
}
else {
if ((*stack)->top->next == NULL) {//考虑只有一个结点
x = (*stack)->top->data;
newnode = (*stack)->top;
(*stack)->top = NULL;
}
else {
newnode = (*stack)->top;
(*stack)->top = newnode->next;
free(newnode);
}
return stack;
}
}