一.静态栈的简单操作
先来简单的了解一下栈
1.栈:一种特殊的线性表,其实只允许在固定的一端进行插入或删除操作。进行数据插入和删除的一端称为栈顶,另一端称为栈底。不含任何元素的栈称为空栈,栈又称为 后进先出的线性表。
1.栈:一种特殊的线性表,其实只允许在固定的一端进行插入或删除操作。进行数据插入和删除的一端称为栈顶,另一端称为栈底。不含任何元素的栈称为空栈,栈又称为 后进先出的线性表。
特性栈:后进先出(LILO)特殊线性表
栈功能:将数据从一种序列改变为另一种序列
2.顺序栈和顺序表数据成员相同,不同之处:
顺序栈的入栈和出栈操作只允许对当前栈顶进行操作!
顺序栈所有的的操作时间复杂度为O(1)
注意:面试中如果需要用到栈,封装静态栈
下边来看一些对栈进行简单操作的代码
stack.h
#pragma once
#include<stdio.h>
#include<Windows.h>
typedef int DataType;
#define MAX_SIZE 100
typedef struct Stack
{
DataType _array[MAX_SIZE];
int _top;
}Stack;
// 栈的初始化
void StackInit(Stack* s);
// 入栈
void StackPush(Stack* s, DataType data);
// 出栈
void StackPop(Stack* s);
// 获取栈顶元素
DataType StackTop(Stack* s);
// 获取栈中元素个数
int StackSize(Stack* s);
// 检测栈是否为空
int StackEmpty(Stack* s);
//打印栈
void stackprint(Stack* s);
stack.c
#include"stack.h"
//初始化栈
void StackInit(Stack* s)
{
if (NULL == s)
{
return;
}
s->_top = (Stack*)malloc(sizeof(Stack));
s->_top = 0;
}
//入栈
void StackPush(Stack* s, DataType data)
{
if (NULL == s)
{
printf("栈已空!!!");
return;
}
s->_array[s->_top] = data;
++s->_top;
}
//出栈
void StackPop(Stack* s)
{
if (NULL == s)
{
printf("栈已空!!!");
return;
}
if (s->_top == 0)
{
printf("栈已空!!!");
return;
}
s->_top--;
}
//打印栈顶元素
DataType StackTop(Stack* s)
{
if (NULL == s)
{
printf("栈已空!!!");
return 0;
}
return s->_array[s->_top - 1];
}
//打印栈的元素个数
int StackSize(Stack* s)
{
if (NULL == s)
{
printf("栈已空!!!");
return 0;
}
return s->_top;
}
//判断元素是否为空
int StackEmpty(Stack* s)
{
if (NULL == s)
{
printf("栈已空!!!");
return 0;
}
if (s->_top == 0)
{
printf("栈已空!!!");
return 0;
}
return 1;
}
//打印栈
void stackprint(Stack* s)
{
int i = 0;
if (NULL == s)
return;
for (; i < s->_top; i++)
{
printf("%d ", s->_array[i]);
}
printf("\n");
}
test.c
#include"stack.h"
void test()
{
Stack s;
StackInit(&s);
StackPush(&s,2);
StackPush(&s,3);
StackPush(&s,4);
StackPush(&s,5);
stackprint(&s);
StackPop(&s);
stackprint(&s);
StackTop(&s);
}
int main()
{
test();
system("pause");
return 0;
}