1 栈的定义
栈是一种“先进后出”的数据结构,有压栈、出栈两种操作方式,栈顶允许操作,栈底不允许操作,如图1所示,
图1
栈的基本操作包括创建栈,销毁栈,出栈,入栈,获取栈顶元素,获取栈的大小,清空栈。
2 栈的分类
栈主要分为两类:静态栈与动态栈
静态栈:静态栈的核心是数组,类似于一个连续内存的数组,我们只能操作栈顶元素。
动态栈:动态栈的核心是链表,我们也只能操作栈顶元素。
3 栈的算法
栈的算法主要是压栈和出栈两种操作算法:
(1)栈操作的是一个一个节点;
(2)栈本身也是一一种存储的数据结构;
(3)栈有初始化、销毁、出栈、入栈、判空、遍历等方法
4 栈的方法
4.1 栈的初始化
typedef struct LinkList
{
int val;
LinkList *next;
};
typedef struct LinkStack
{
int len;
LinkList *top;
LinkList *bot;
};
//创建栈
LinkStack*creat_LinkStack()
{
LinkStack *p = (LinkStack*)malloc(sizeof(LinkStack));//栈的初始化
p->top=p->bot = (LinkList*)malloc(sizeof(LinkList));//栈顶与栈底为同一位置
if (p->top == NULL) return NULL;//判断是否还有内存
p->top->next= NULL;//只有一个链表结构
return p;
}
.4.2 栈的判空
//判断是否为空
bool is_Empty(LinkStack*p)
{
if (p->top == p->bot) return true;
else
{
return false;
}
}
4.3 入栈
//入栈
int push_LinkStack(LinkStack*s, int x)
{
LinkList *Node = (LinkList*)malloc(sizeof(LinkList));
Node->val = x;
Node->next =NULL;
Node->next = s->top;//先将以前的链表与push的进行连接
s->top = Node;//栈顶指向push进去的链表
return 1;
}
4.4 出栈
//出栈
int pop_LinkStack(LinkStack*s)
{
if (is_Empty(s))
{
printf("该栈为空栈");
return 0;
}
LinkList *del = s->top;
s->top = s->top->next;
int ret = del->val;
free(del);
del = NULL;
return ret;
}
4.5 清空栈
//清空栈
int clear_LinkStack(LinkStack*p)
{
if (is_Empty(p)) { return 1; }
LinkList *Node = p->top;
while (Node!=p->bot)
{
p->top = p->top->next;
free(Node);
//Node = NULL;
Node = p->top;
}
p->top=p->bot;
return 1;
}
4.6 遍历栈
//遍历,打印栈
void traverse(LinkStack*s)
{
if(is_Empty(s))
{
printf("为空栈");
printf("\n");
}
int count = 0;
LinkList*Node = s->top;
while (Node!=s->bot)
{
count += 1;
printf("第%d个值为%d", count, Node->val);
Node = Node->next;
printf("\n");
}
}
4.7 主程序
int main()
{
LinkStack*s;
s=creat_LinkStack();
push_LinkStack(s, 1);
push_LinkStack(s, 2);
push_LinkStack(s, 3);
traverse(s);
//pop
pop_LinkStack(s);
//遍历栈
traverse(s);
//清空
clear_LinkStack(s);
traverse(s);
system("pause");
converse();
bracket_matching();
system("pause");
}
5 栈的案例
5.1 将一个十进制转为8进制输出
void converse()
{
LinkStack*s;
int N;
s = creat_LinkStack();
//输入10进制数
printf("请输入一个十进制数");
scanf_s("%d", &N);
while (N)
{
push_LinkStack(s, N % 8);
N = N /8;
}
//输出八进制数
printf("八进制数为:\n");
while (!is_Empty(s))
{
printf("%d", pop_LinkStack(s));
}
printf("\n");
}
5.2 匹配括号的检验
//匹配括号的检验
void bracket_matching()
{
LinkStack *s = creat_LinkStack();
int N;
printf("清输入对应的括号\n");
scanf_s("%d", &N);
if (is_Empty(s))
{
push_LinkStack(s, N);
}
while (!is_Empty(s))
{
int M;
printf("清输入对应的括号\n");
scanf_s("%d", &M);
if (M == 0) break;
if (s->top->val == M)
{
printf("匹配成功\n"); pop_LinkStack(s); traverse(s);
}
else
{
printf("未消除\n");
push_LinkStack(s, M);
}
}
}