基础数据结构(2):栈
2023-12-23 17:52:33
1.栈的定义
? ? ?栈是仅限在表尾进行插入和删除的线性表,栈又被称为后进先出的线性表
?1.1栈顶和栈底
? ? ?栈是一个线性表,我们允许插入和删除的一端称为栈顶
? ? ?栈底和栈顶相对,实际上栈底的元素不需要关心
1.2入栈和出栈
? ? ?栈元素的插入操作叫做入栈,也可称为进栈、压栈
2.栈的特点
? ? ?栈也是一种线性结构,栈只能从一端添加元素,也只能从这一端取出元素,向栈中添加元素的过程,称为入栈,从栈中取出元素的过程称为出栈
3.栈的链表实现
? ? ?利用链表来模拟栈,每个栈元素可以用一个链表结点表示,data代表数据域,next代表指针域
typedef struct StackNode
{
int data;
StackNode* next;
}StackNode;
? ? ? stack表示栈,其中head指向栈顶,size代表栈中元素个数
typedef struct Stack
{
StackNode* head;
int size;
}Stack;
3.1入栈和出栈
? ? ?栈元素的插入操作叫做入栈,新建一个值为1的结点,并且将它指向栈顶,将它标记为新的栈顶
?
void StackPushStack(Stack* stk, int dt)
{
StackNode* vtx = (StackNode*)malloc(sizeof(StackNode));//首先生成一个栈元素结点
vtx->next = stk->head;//将它的后继指向当前得到栈顶
vtx->data = dt;//数据域为dt
stk->head = vtx;//将vtx作为新的栈顶
++stk->size;//对栈中元素计数加一
}
? ? ?栈元素的删除操作叫做出栈,也可称为弹栈
??
void StackPopStack(Stack* stk)
{
StackNode* temp = stk->head;//将当前的栈顶元素存储在temp中
stk->head = temp->next;//将新的栈顶指向栈顶的后继
free(temp);//释放temp的内存
--stk->size;//对栈中元素计数减一
}
3.2栈的遍历
? ? ?想要输出栈内存储的所有元素,就要使用遍历
void StackPrintStack(Stack* stk)
{
while (stk->head != NULL)
{
printf("%d ", stk->head->data);
stk->head = stk->head->next;
stk->size--;
}
}
3.3完整实现代码
#include<stdio.h>
#include<stdlib.h>
typedef struct StackNode
{
int data;
StackNode* next;
}StackNode;
typedef struct Stack
{
StackNode* head;
int size;
}Stack;
void StackPushStack(Stack* stk, int dt)
{
StackNode* vtx = (StackNode*)malloc(sizeof(StackNode));//首先生成一个栈元素结点
vtx->next = stk->head;//将它的后继指向当前得到栈顶
vtx->data = dt;//数据域为dt
stk->head = vtx;//将vtx作为新的栈顶
++stk->size;//对栈中元素计数加一
}
void StackPopStack(Stack* stk)
{
StackNode* temp = stk->head;
stk->head = temp->next;
free(temp);
--stk->size;
}
void StackPrintStack(Stack* stk)
{
while (stk->head != NULL)
{
printf("%d ", stk->head->data);
stk->head = stk->head->next;
stk->size--;
}
}
int main()
{
Stack* stk = (Stack*)malloc(sizeof(Stack));
stk->head =NULL;
stk->size = 0;
int x=0;
scanf_s("%d", &x);
while (x)
{
StackPushStack(stk,x);
scanf_s("%d", &x);
}
StackPrintStack(stk);
return 0;
}
? ?运行结果:
4栈的数组实现
? ? ?这里用到了C++,没学过的可以先只看链表实现
4.1入栈和出栈
? ? ?数组模拟栈时用top表示栈顶所在的索引。初始化top=-1,表示没有元素
const int N = 100010;
int stack[N];
int top = -1;
void StackPushStack(int stack[],int x)
{
stack[++top]=x;
}
? ? ?出栈时,使用pop函数,top向前移动一格,top--。
void StackPopStack(int stack[])
{
top--;
}
?4.2获取栈顶的值
stack[top];
?4.3判断栈是否为空
? ? 如果top>0,则表示不为空
if(top>0)
{
}
4.4完整代码实现
#include<iostream>
using namespace std;
const int N = 100010;
int stack[N];
int top = -1;
int main()
{
int n;
cin >> n;
while (n--)
{
int x;
cin >> x;
stack[++top] = x;
}
for (int i = top-1;i>=0; i--)
{
cout << stack[i] << " " ;
}
cout << endl;
top--;
for (int i = top - 1; i >= 0; i--)
{
cout << stack[i] << " " ;
}
cout << endl;
cout << stack[top] << endl;
if (top > 0)
{
cout << "栈不为空" << endl;
}
}
文章来源:https://blog.csdn.net/pancodearea/article/details/135167350
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!