一、什么是栈?
答:栈是限制在表的一端进行插入和删除的线性表(栈的插入和删除限定在表尾)。在线性表中进行插入、删除操作的一端成为栈顶(Top),栈顶保存的元素成为栈顶元素。相对而言,表的另一端成为栈底(Botton)。当栈中没有数据元素的时候成为空栈。
举例说明:栈就像手枪里面的子弹一样,有顺序存储,只能从一端进行更换;
二、栈的性质
答:由于栈的插入和删除仅在栈顶进行,后进栈的元素必定先出栈,所以又把栈成为后进先出表或先进后出表。
三、栈的存储方式分类
答:和前面所学的线性表相似,分为顺序栈和链栈。这里我们主要讲顺序栈。
四、栈的抽象数据类型定义
五、顺序栈入栈思想
(一)先判断栈是否已满,若没满,则可继续进行入栈操作,否则结束;
(二)栈顶指针先自增,给需要进栈的元素留出存储空间;
(三)将要入栈的元素放入存储空间。
栈顶指针和栈中元素之间的关系
1.空栈中的栈顶指针的指向和栈底指针一致
2.非空栈中的栈顶指针始终在栈顶元素的下一个位置
六、入栈代码实现
//判断顺序栈是否为空
int EMPTY(seqstack *s) {
if(s->top>=0) return 0;
else return 1;
}
//进栈
seqstack *PUSH(seqstack *s) {
int x;
printf("你想要插入的数字:");
scanf("%d",&x);
if(s->top==maxsize-1) {
printf("overflow");
return NULL;
}else{
s->top++;
s->data[s->top] = x;
}
return s;
}
七、出栈操作思想
(一)先判断栈中是否有元素,如果有元素才能出栈,否则结束操作;
(二)将要出栈的元素取出来放在存储空间中;
(三)栈顶指针自减。
八、出栈代码实现
//输出栈
void print(seqstack *s){
int i;
if(s->top<0){
printf("清空栈成功");
}
for(i=s->top;i>=0;i--){
printf("%d\n",s->data[i]);
}
}
九、完整代码实现
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
//定义符号变量
#define maxsize 64
//定义数据元素类型
typedef int datatype;
//定义结构体
typedef struct{
datatype data[maxsize];
int top;
}seqstack;
//建立顺序栈
seqstack *SET(seqstack *s){
int i;
s=(seqstack*)malloc(sizeof(seqstack));
s->top=-1;
printf("请输入顺序栈元素(输入0的时候结束):");
scanf("%d",&i);
do{
s->top++;
s->data[s->top]=i;
scanf("%d",&i);
}while(i!=0);
printf("顺序栈建立成功\n");
return s;
}
//清空顺序栈
void SETNULL(seqstack *s) {
s->top=-1;
}
//判断顺序栈是否为空
int EMPTY(seqstack *s) {
if(s->top>=0) return 0;
else return 1;
}
//进栈
seqstack *PUSH(seqstack *s) {
int x;
printf("你想要插入的数字:");
scanf("%d",&x);
if(s->top==maxsize-1) {
printf("overflow");
return NULL;
}else{
s->top++;
s->data[s->top] = x;
}
return s;
}
//退栈
seqstack *POP(seqstack *s) {
if(s->top<0){
printf("underlow");
return s;
}else{
s->top--;
printf("删除的栈顶元素是:");
printf("%d\n",(s->data[s->top+1]));
}
return s;
}
//取栈顶
void TOP(seqstack *s){
if(s->top<0){
printf("stack is empty");
}else{
printf("当前的栈顶元素是:");
printf("%d\n",(s->data[s->top]));
}
}
//输出栈
void print(seqstack *s){
int i;
if(s->top<0){
printf("清空栈成功");
}
for(i=s->top;i>=0;i--){
printf("%d\n",s->data[i]);
}
}
//主函数
int main(){
seqstack *s;
int i,j;
printf("\n 欢迎使用\n");
printf("--------------------------\n");
printf("1.建立一个顺序栈\n");
printf("2.输出栈\n");
printf("3.进栈\n");
printf("4.退栈\n");
printf("5.取栈顶元素\n");
printf("6.清空栈\n");
printf("7.判断栈是否为空\n");
printf("8.结束程序\n");
printf("---------------------------\n");
do{
printf("请选择想要实现的功能\n");
scanf("%d",&i);
switch(i){
case 1:s=SET(s);break;
case 2:print(s);printf("\n");break;
case 3:s=PUSH(s);print(s);printf("\n");break;
case 4:s=POP(s);print(s);printf("\n");break;
case 5:TOP(s);break;
case 6:SETNULL(s);print(s);printf("\n");break;
case 7:j=EMPTY(s);if(j==1){printf("空栈\n");}else{printf("非空栈");}break;
default:printf("-----------------谢谢您的使用----------\n");
exit(12);
}
}while(1);
return 0;
}