栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入删除操作的一端称为栈顶,另一端称为栈底。不含任何元素的栈称为空栈
栈最大的特点就是:先进后出,后进先出
栈可分为顺序栈和链式栈
1)顺序栈所有的操作时间复杂度都是O(1)
2)链式栈就不一定了得看你的栈顶位于链表的头还是尾(一般建议将栈顶设计在链表头的位置,这样入栈出栈操作都是O(1)。否则入栈是O(1)出栈是O(N)。可以思考一下原因 --> 因为你删除掉链表的最后一个元素,可是他的前一个元素你得遍历整个链表才能得知,进而才能重新确定栈顶位置)
在此我实现顺序栈(操作相对都简单些^0^)
#define MAX (100)
typedef char SDataType;
typedef struct stack
{
//定义一个数组存放数据
SDataType array[MAX];
//表示栈内有效元素的个数,也表示此时栈顶位置的下标
int top;
}stack;
我的栈中实现了以下的基本操作
//栈的初始化
void stackInit(stack *ps);
//入栈操作
void stackPush(stack *ps, SDataType data);
//出栈操作
void stackPop(stack *ps);
//求得栈顶元素
SDataType stackTop(stack *ps);
//判断是否为空栈
int stackIsEmpty(stack *ps);
//求得栈的大小(含数据的个数)
int stackSize(stack *ps);
//将栈进行拷贝
void stackCopy(stack *psDest, stack *psSrc);
1)初始化
void stackInit(stack *ps)
{
assert(ps != NULL);
ps->top = 0;
}
2)入栈
void stackPush(stack *ps, SDataType data)
{
assert(ps != NULL);
assert(ps->top < MAX);
ps->array[ps->top] = data;
ps->top++;
}
3)出栈
void stackPop(stack *ps)
{
assert(ps != NULL);
assert(ps->top > 0);
ps->top--;
}
4)栈顶元素
SDataType stackTop(stack *ps)
{
assert(ps != NULL);
assert(ps->top > 0);
return ps->array[ps->top - 1];
}
5)是否为空栈
//空栈返回1,否则返回0
int stackIsEmpty(stack *ps)
{
assert(ps != NULL);
if (ps->top == 0){
return 1;
}
else{
return 0;
}
}
6)栈大小
int stackSize(stack *ps)
{
assert(ps != NULL);
return ps->top;
}
7)栈拷贝
void stackCopy(stack *psDest, stack *psSrc)
{
assert(psDest != NULL);
assert(psSrc != NULL);
psDest->top = psSrc->top;
memcpy(psDest->array, psSrc->array, sizeof(SDataType)* psSrc->top);
}
总结:了解了之前顺序表博客的内容后,相信对栈的操作就更容易了。因为栈只能在一端进行操作