C语言 顺序栈的相关操作

一、栈的定义

堆栈简称栈,是限定仅在表的一端进行插入和删除操作的线性表。通常将进行插入和删除的一端叫做栈顶(top),不允许

插入和删除的一端叫做栈底(bottom),不含任何元素的栈叫做空栈。

由于堆栈元素的插入和删除操作只是在栈顶进行,总是后进去的元素先出来,所以堆栈又称为后进先出线性表。

理解栈的定义需要注意:它是一种线性表,即具有线性关系,前趋后继关系。

重点:通常情况下我们把空栈的判断条件定位为top=-1,当栈中有一个元素时top=0,而栈满时top=MAXSIZE-1

 

二、栈的顺序存储结构

栈的顺序存储也成顺序表,类似于顺序表,用一维数组来存放栈中元素,栈底一般固定设在下标为0的一端,用一个变量top

指示当前栈顶元素所在单元的位置。

栈的顺序存储的结构定义:

 

typedef struct{
    int data[MAXSIZE];
    int top;    
}SeqStack;

 

(1)初始化栈:

1 //初始化栈 
2 void initStack(SeqStack *s){
3     s->top=-1;
4 } 

(2)判断栈是否为空:

1 bool stackempty(SeqStack *s){
2     if(s->top==-1){
3         printf("栈是空栈\n");
4         return true;
5     }else{
6         printf("栈不是空栈\n");
7         return false;
8     }
9 }

(3)获取栈顶元素:

1 bool Gettop(SeqStack *s,int *e){
2     if(s->top==-1){
3         printf("栈是空栈\n");
4         return true;
5     }else{
6         *e=s->data[s->top];
7         return false;
8     }
9 }

(4)遍历顺序栈:

1 1 //遍历顺序栈 
2 2 void DispStack(SeqStack *s){
3 3     int i=s->top;
4 4     while(i!=-1){
5 5         printf("%d ",s->data[i]);
6 6         i--;
7 7     }
8 8     printf("\n"); 
9 9 } 

(5)进栈与出栈:

 1 //进栈 
 2 bool pushStack(SeqStack *s,int e){
 3     if(s->top==MAXSIZE-1){
 4         printf("栈是满栈\n");
 5         return true;
 6     }else{
 7         s->top++;
 8         s->data[s->top]=e;
 9         return false;
10     }
11 }
12 //出栈 
13 bool popStack(SeqStack *s,int *e){
14     if(s->top<=-1){
15         printf("栈是空栈\n");
16         return false;
17     }else{
18         *e=s->data[s->top];
19         s->top--;
20         return true;
21     }
22 }

 

总代码:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <stdbool.h>
  4 #include <time.h>
  5 #define MAXSIZE 100
  6 typedef int Elemtype;
  7 typedef struct{
  8     int data[MAXSIZE];
  9     int top;    
 10 }SeqStack;
 11 //初始化栈 
 12 void initStack(SeqStack *s){
 13     s->top=-1;
 14 } 
 15 //判断栈是否为空 
 16 bool stackempty(SeqStack *s){
 17     if(s->top==-1){
 18         printf("栈是空栈\n");
 19         return true;
 20     }else{
 21         printf("栈不是空栈\n");
 22         return false;
 23     }
 24 }
 25 //获取栈顶元素 
 26 bool Gettop(SeqStack *s,int *e){
 27     if(s->top==-1){
 28         printf("栈是空栈\n");
 29         return true;
 30     }else{
 31         *e=s->data[s->top];
 32         return false;
 33     }
 34 }
 35 //遍历顺序栈 
 36 void DispStack(SeqStack *s){
 37     int i=s->top;
 38     while(i!=-1){
 39         printf("%d ",s->data[i]);
 40         i--;
 41     }
 42     printf("\n"); 
 43 } 
 44 
 45 //进栈 
 46 bool pushStack(SeqStack *s,int e){
 47     if(s->top==MAXSIZE-1){
 48         printf("栈是满栈\n");
 49         return true;
 50     }else{
 51         s->top++;
 52         s->data[s->top]=e;
 53         return false;
 54     }
 55 }
 56 //出栈 
 57 bool popStack(SeqStack *s,int *e){
 58     if(s->top<=-1){
 59         printf("栈是空栈\n");
 60         return false;
 61     }else{
 62         *e=s->data[s->top];
 63         s->top--;
 64         return true;
 65     }
 66 }
 67 int main(){
 68     SeqStack *s;
 69     s=(SeqStack *)malloc(sizeof(SeqStack));
 70     int num;
 71     Elemtype e;
 72     printf("顺序栈的相关操作:\n"); 
 73     printf("(1)依次进栈:1 2 3 4 \n");
 74     initStack(s); 
 75     pushStack(s,1);
 76     pushStack(s,2);
 77     pushStack(s,3);
 78     pushStack(s,4);
 79     printf("(2)从栈顶遍历栈:");
 80     DispStack(s);
 81     printf("(3)判断栈是否为空:");
 82     stackempty(s);
 83     printf("(4)获取栈顶元素:");
 84     Gettop(s,&num); 
 85     printf("%d\n",num);
 86     printf("(5)出栈栈顶元素:");
 87     popStack(s,&num);
 88     printf("%d\n",num);
 89     printf("(6)获取栈顶元素:");
 90     Gettop(s,&num); 
 91     printf("%d\n",num);
 92     printf("(7)出栈所有元素:");
 93     popStack(s,&num);
 94     printf("出栈%d ",num);
 95     popStack(s,&num);
 96     printf("出栈%d ",num);
 97     popStack(s,&num);
 98     printf("出栈%d ",num);
 99     popStack(s,&num);
100     printf("(8)获取栈顶元素:");
101     popStack(s,&num);
102     printf("(9)判断栈是否为空:");
103     stackempty(s);
104     return 0;
105 } 

 

运行结果:

 

最近在学数据结构,欢迎交流学习!!

 

posted @ 2021-09-12 14:56  旺旺哈  阅读(163)  评论(0)    收藏  举报