堆栈是一种只允许在表的一端(称为栈顶)进行插入和删除的线性表,而在表的另一端(称为栈底)是不能进行操作的,也是线性表的一种特例。
堆栈的顺序存储是用数组来是实现的。为了表示栈,我们需要一个栈顶指针top来指示栈顶位置。下面的代码实现了对顺序栈的相关操作。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct
{
int data[MAXSIZE];
int top; //栈顶指针
}sqstack;
sqstack *Sqstack_Create(); //创建堆栈
int Sqstack_GetTop(sqstack *q); //取得栈顶
int Sqstack_In(sqstack *q, int dat); //入栈
int Sqstack_Out(sqstack *q); //出栈
void Sqstack_SetNull(sqstack *q); //栈置空
int Sqstack_Empty(sqstack *q); //判断栈是否空
void ShowSqstack(sqstack *q); //输出显示堆栈
int main(atevoid)
{
sqstack *q;
int choice;
int ans, dat;
printf("顺序栈操作练习:\n");
q = Sqstack_Create();
while(1)
{
printf("顺序栈相关操作:\n");
printf("1.取栈顶结点\n");
printf("2.入栈\n");
printf("3.出栈\n");
printf("4.输出显示栈\n");
printf("5.退出程序\n");
printf("做出选择:");
scanf("%d", &choice);
switch(choice)
{
case 1:
ans = Sqstack_GetTop(q);
if(ans == -1)
printf("取栈顶结点失败!\n");
else
printf("栈顶结点为%d\n", ans);
break;
case 2:
printf("输入你想入栈的数据:");
scanf("%d",&dat);
ans = Sqstack_In(q, dat);
if(!ans)
printf("入栈失败\n");
else
printf("入栈成功\n");
break;
case 3:
ans = Sqstack_Out(q);
if(ans == -1)
printf("出栈失败!\n");
else
printf("出栈成功!\n");
break;
case 4:
ShowSqstack(q);
break;
case 5:
return 0;
break;
default:
printf("选择无效!\n");
break;
}
}
return 1;
}
//置空栈
void Sqstack_SetNull(sqstack *q)
{
q->top = -1; //空栈时栈顶指针为-1
}
//判断堆栈是否空
int Sqstack_Empty(sqstack *q)
{
if(q->top == -1) //堆栈栈顶为-1则为空
return 1;
else
return 0;
}
//堆栈创建
sqstack *Sqstack_Create()
{
sqstack *q;
int num, i;
q = (sqstack*)malloc(sizeof(sqstack));
Sqstack_SetNull(q);
printf("输入想创建堆栈数据的个数:");
scanf("%d", &num);
if(num>MAXSIZE-1)
return NULL;
printf("依次输入堆栈的数据:");
for(i=0;i<num;i++)
{
scanf("%d", &q->data[i]);
q->top++;
}
return q;
}
//取得栈顶
int Sqstack_GetTop(sqstack *q)
{
if(Sqstack_Empty(q)) //先要判断是否为空栈
return -1;
else
return q->data[q->top];
}
//入栈
int Sqstack_In(sqstack *q, int dat)
{
if(q->top == MAXSIZE-1) //先要判断堆栈是否已满
return 0;
else
{
q->top += 1;
q->data[q->top] = dat;
return 1;
}
}
//出栈
int Sqstack_Out(sqstack *q)
{
if(Sqstack_Empty(q)) //先要判断堆栈是否为空
return -1;
else
return q->data[q->top--];
}
//输出显示堆栈
void ShowSqstack(sqstack *q)
{
int i;
for(i=0; i<=q->top; i++)
{
printf("%d ", q->data[i]);
}
printf("\n");
}