顺序栈的完整实现
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define STACK_INIT_SIZE 15//栈的初始空间大小
#define STACKINCREMENT 5//栈的追加空间大小
typedef struct MyStruct
{
int* top; //top指针记录栈顶元素在栈中的位置
int* base; //base指针,始终指向栈底
int stacksize; //当前已分配的存储空间大小
}SqStack;
void InitStack(SqStack *s)//初始化空栈
{
s->base = (int*)malloc(STACK_INIT_SIZE * sizeof(int));//分配int大小的(STACK_INIT_SIZE)个连续存储空间
if (!(s->base))
{
printf("分配失败!!\n");
}
else
{
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
printf("空栈初始化完成!!\n");
}
}
void IsEmpty(SqStack *s)//判断栈是否为空
{
if (s->top == s->base)
{
printf("栈为空!!\n");
}
else
{
printf("栈非空!!\n");
}
}
int IsFull(SqStack *s)//判断栈是否已满
{
if (s->top - s->base == s->stacksize - 1)
{
printf("栈已满!!\n");
}
else
{
printf("栈不满!!\n");
}
return 0;
}
void PushStack(SqStack *s)//元素入栈
{
//InitStack(s);
int x;
if (s->top - s->base >= s->stacksize)
{
s->base = (int*)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(int));
}
printf("请输入要入栈的元素:\n");
scanf("%d", &x);
*(s->top) = x;
s->top++;
}
void PopStack(SqStack *s)//元素出栈
{
//InitStack(s);
printf("**********\n");
if (s->top == s->base)
{
printf("判断: 栈为空,不能操作出栈\n");
}
else
{
int x;
x= *(s->top - 1);//先把top位置上的值赋给x,再让top往下移动一位
s->top--;
printf("%d 出栈\n", x);
}
}
void GetTop(SqStack *s)//获取栈顶元素
{
if (s->top > s->base)
{
printf("**********\n");
printf("栈顶元素为:%d\n", *(s->top - 1));
printf("**********\n");
}
else
{
printf("栈为空!!\n");
}
}
void Show(SqStack *s)//该函数用来在元素都完成出栈后进行原来位置打印,对比效果
{
printf("栈中元素原来位置上的值为:");
printf("%d ", *(s->top));
}
void GetLength(SqStack *s)//获取栈长
{
int size;
size= (s->top) - (s->base);
printf("栈长为:%d\n", size);
}
void Display(SqStack *s)//遍历栈,从栈底开始遍历
{
while (s->base <= s->top)
{
printf("%d ", *(s->base++));
}
}
void Menue()
{
SqStack s;
int flag;
printf("\t\t\t**********\n");
printf("\t\t\t1:初始化\n");
printf("\t\t\t2:判断是否为空\n");
printf("\t\t\t3:判断是否为满\n");
printf("\t\t\t4:元素入栈\n");
printf("\t\t\t5:元素出栈\n");
printf("\t\t\t6:取栈顶元素\n");
printf("\t\t\t7:获取栈长度\n");
printf("\t\t\t8:遍历栈元素\n");
printf("\t\t\t9:遍历位置元素\n");
printf("\t\t\t0:退出\n");
printf("\t\t\t**********\n");
printf("请输入相应的序号操作:\n");
scanf("%d", &flag);
while (1)
{
switch (flag)
{
case1:InitStack(&s);
break;
case 2:IsEmpty(&s);
break;
case 3:IsFull(&s);
break;
case 4:PushStack(&s);
break;
case 5:PopStack(&s);
break;
case 6:GetTop(&s);
break;
case7:GetLength(&s);
break;
case 8:Display(&s);
break;
case 9:Show(&s);
break;
case 0:exit(0);
break;
default:printf("输入指令有误!!\n");
break;
}
printf("请输入相应的序号操作:\n");
scanf("%d", &flag);
}
}
void main()
{
Menue();//主函数调用
system("pause");
}