栈:只能在表尾进行插入和删除操作,也是线性表。栈元素先进后出,最先进栈的只能在栈底,栈的插入称为:进栈、入栈,删除称为:出栈或弹栈。
顺序栈:以数组0下标为栈底。top记录栈底元素在数组中的位置,是变化的,top<栈(数组)长度,top为0时栈有1个元素,top为-1时是空栈。
基于数组对栈进行插入 删除 显示:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define N 10
typedef struct
{
int data[N];//栈的元素
int top; //数组的下标,表示栈顶下标
}srack;
//初始化栈
void initsrack(srack *s)
{
s->top=-1;
}
//判断栈是否为空
void srackempty(srack *s)
{
if (s->top==-1)
printf("栈为空\n");
else
printf("栈不为空\n");
}
//删除栈顶元素
void pop(srack *s)
{
int e;
if (s->top==-1)
printf("栈为空");
else
{
e=s->data[s->top];
s->top--;
printf("删除元素%d后还剩%d个元素\n",e,s->top+1);
}
}
//入栈
void push(srack *s)
{
if (N-s->top==1)//栈满
{
printf("栈已满\n");
}
else
{
printf("输入进栈的值:");
scanf("%d",&s->data[++s->top]);
printf("入栈成功\n");
}
}
void print()
{
printf("输入口令:\n");
printf("1.判断栈是否为空\n");
printf("2.入栈\n");
printf("3.显示栈元素个数以及栈顶元素\n");
printf("4.删除栈顶元素\n");
printf("5.退出\n\n\n");
}
void display(srack *s)
{
if (s->top==-1)
printf("栈为空");
else
printf("此时栈有%d个元素,栈顶元素为%d\n",s->top+1,s->data[s->top]);
}
int main()
{
print();//显示菜单
int n;//口令变量
int c=1;
srack *s;
s=(srack*)malloc(sizeof(srack));
initsrack(s);//初始化栈
while (c)
{
printf("\n输入操作口令:\n");
scanf("%d",&n);
system("cls");//清屏
print();
switch(n)
{
case 1:srackempty(s);break;//判断栈是否为空
case 2:push(s);break;//入栈
case 3:display(s);break;//显示
case 4:pop(s);break;//出栈
case 5:c=0;
}
}
}