C语言数据结构之顺序栈
tips:前些天学习了顺序表的一系列操作,今天来看看C语言数据结构之顺序栈的实现以及关于顺序栈的各种操作。
栈的特点是先进后出,后进先出,在数组中可利用一个指向数组下标指针top来进行顺序栈的相关操作。
首先我们定义一个顺序栈的结构体
#define MaxSize 10 //给顺序栈定义默认大小
typedef struct {
int data[MaxSize];//静态数组存放栈中元素
int top;//栈顶指针(数组下标)
}Stack,*pStack;
准备栈中元素打印输出函数
//打印栈中元素
void print_Stack(pStack s)
{
if (s->top == -1)
{
printf("栈空!\n");
}
else
{
for (int i = 0; i <= s->top; i++)
{
printf("%d\n", s->data[i]);
}
}
printf("-------------------------------------------\n");
}
1、栈的初始化(InitStack)
//初始化栈
void InitStack(pStack s)
{
s->top = -1;//初始化时候,栈中还没有元素,先让top为-1
}
2、入栈(push)
思路:
- 当栈已满时,不予入栈;
- 当栈未满时,将栈顶指针top+1,并入栈;
具体实现:
//入栈
void push(pStack s, int e)
{
if (s->top == MaxSize - 1)
{
//栈满
printf("栈满!\n");
}
else
{
s->top++;
s->data[s->top] = e;
}
}
3、出栈(pop)
思路:
- 当栈空时,不予出栈;
- 当栈非空时,出栈(栈顶指针下移)=>top-1;
具体实现:
//出栈
void pop(pStack s)
{
if (s->top == -1)
{
printf("栈空!\n");
}
else
{
s->top--;
}
}
4、返回栈顶元素(GetTop)
思路:
- 当栈空时,返回0;
- 当栈非空时,返回data[top];
具体实现:
//返回栈顶元素
int GetTop(pStack s)
{
if (s->top == -1)
{
//栈空
return 0;
}
else
{
return s->data[s->top];
}
}
5、判断栈空(StackEmpty)
思路:
- 当栈顶指针的值为-1时,栈为空,返回1;
- 栈非空时,返回0;
具体实现:
//判断栈空
int StackEmpty(pStack s)
{
if (s->top == -1)
{
//栈空
return 1;
}
else
{
return 0;
}
}
到此我们就完成了顺序栈的基本操作,还是很简单的! 下面在main()函数中测试一下:
int main()
{
Stack sta;//定义栈
pStack s = &sta;
int e;//入栈的元素
char panduan;//判断出栈
//初始化栈
InitStack(s);
//入栈
while (scanf("%d",&e) != EOF)
{
push(s, e);
}
print_Stack(s);
//返回栈顶元素并且判断栈是否为空
if (StackEmpty(s))
{
printf("栈空!\n");
}
else
{
printf("栈顶元素:%d\n", GetTop(s));
}
//出栈
while (printf("是否出栈?(y/n):"), scanf("%c", &panduan))
{
if (panduan == 'n')
{
break;
}
else if(panduan == 'y')
{
//出栈
pop(s);
//返回栈顶元素并且判断栈是否为空
if (StackEmpty(s))
{
printf("栈空!\n");
}
else
{
printf("栈顶元素:%d\n", GetTop(s));
}
print_Stack(s);
}
}
return 0;
}
测试结果:
希望对大家的学习能够有所帮助,加油!
tips:世上没有白费的努力,更没有碰巧的成功,不要揠苗助长,不要急于求成,只要一点一点去做,一步步去走,成功,不过是水到渠成。