数据结构学习~08.顺序栈和链栈
本文是上一篇文章的后续,详情点击该链接~
顺序栈
顺序栈的状态
栈空状态
stack.top = -1。
栈满状态
stack.top == MAXSIZE - 1。MAXSIZE作为栈中最大元素的个数,则 MAXSIZE - 1 为栈满时栈顶元素在数组中的位置,因为数组的下标从 0 号开始。
顺序栈代码实现
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
//顺序栈的定义
typedef struct {
int data[MAXSIZE]; //存放栈中元素,MAXSIZE是已经定义的常量
int top; //栈顶指针
}SqStack; //顺序栈结点定义
//初始化栈
void initStack(SqStack &stack) {
stack.top = -1; //初始化一个栈,只需将栈顶指针置为 -1 即可
}
//判断栈空
int isEmpty(SqStack stack) {
return stack.top == -1 ? 1 : 0;
}
//进栈
int push(SqStack &stack, int x) {
//如果栈满了,则不能进栈
if (stack.top == MAXSIZE - 1) {
return 0;
}
//先移动指针,再进栈
++(stack.top);
stack.data[stack.top] = x;
return 1;
}
//出栈
int pop(SqStack &stack) {
//用来保存被删除的元素
int x = 0;
//如果栈空则不能出栈
if (stack.top == -1) {
return 0;
}
//先取出元素,再移动指针
x = stack.data[stack.top];
--(stack.top);
//返回被删除的元素
return x;
}
//遍历
void Print(SqStack stack) {
int i;
for (i = 0; i < stack.top; i++) {
printf("%d ",stack.data[i]);
}
printf("\n");
}
int main(int argc,char*argv[]) {
//创建一个栈
SqStack stack;
int i = 1,x = 0;
//初始化
initStack(stack);
//添加 1 ~ 9
for (i = 1; i < 11; i++) {
push(stack,i);
}
//遍历
printf("删除前: "); Print(stack);
//删除
x = pop(stack);
printf("删除后: "); Print(stack);
return 0;
}
链栈
链栈的状态
栈空状态
stack->next == NULL
链栈基本上不存在栈满状态~前提是没有人抬杠
#include<stdio.h>
#include<stdlib.h>
//链栈结点定义
typedef struct StackNode {
int data; //数据域
struct StackNode* next; //指针域
}StackNode;
//链栈的初始化代码
//stack要改变,所以用引用型
void initStack(StackNode *&stack) {
//制造一个头节点
stack = (StackNode*)malloc(sizeof(StackNode));
stack->next = NULL;
}
//判断栈空代码
int isEmpty(StackNode *stack) {
return stack->next == NULL ? 1 : 0;
}
//进栈代码
void push(StackNode *stack, int x) {
//进栈元素的申请结点空间
StackNode* p = (StackNode*)malloc(sizeof(StackNode));
p->next = NULL;
//链栈的头插法
p->data = x;
p->next = stack->next;
stack->next = p;
}
//出栈
int pop(StackNode *stack) {
StackNode* p;
//用来保存被删除的值
int x = 0;
//栈空则不能出栈
if (stack->next == NULL) {
return 0;
}
//删除操作,和单链表的思想一模一样
p = stack->next;
x = p->data; //保存被删除的值
stack->next = p->next;
free(p);
return x;
}
//遍历
void Print(StackNode *stack) {
StackNode* temp = stack->next;
//判断是否为空
if (isEmpty == 0) {
printf("[ ]");
return;
}
//遍历
while (temp != NULL) {
//判断是否到了最后一个
if (temp ->next != NULL) {
printf("%d -> ",temp->data);
}
else {
printf("%d",temp->data);
}
temp = temp->next;
}
printf("\n");
}
int main(int argc, char* argv[]) {
//创建一个栈
StackNode* stack = (StackNode*)malloc(sizeof (StackNode));
int i = 0,x = 0;
//初始化栈
initStack(stack);
//插入十九个元素
for (i = 1; i < 20; i++) {
push(stack,i);
}
//遍历
printf("删除前: "); Print(stack);
//删除
x = pop(stack);
printf("删除后: "); Print(stack);
return 0;
}