• 数据结构-栈有关操作算法


    程序代码如下:

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 #define STACK_INIT_SIZE 100
      5 #define STACKINCREMENT 10
      6 #define OVERFLOW -2
      7 #define OK 1
      8 #define ERROR 0
      9 
     10 typedef int SElemType;
     11 
     12 //栈结构体
     13 typedef struct {
     14     SElemType *base;
     15     SElemType *top;
     16     int stacksize;
     17 }SqStack;
     18 
     19 int InitStack(SqStack *S);//初始化栈
     20 int GetTop(SqStack *S,SElemType *e);//取得栈顶元素
     21 int Push(SqStack *S,SElemType e);//入栈
     22 int Pop(SqStack *S,SElemType *e);//删除栈中的元素
     23 int DestoryStack(SqStack *S);//销毁栈
     24 int StackEmpty(SqStack *S);//判断栈是否为空
     25 int StackLength(SqStack *S);//取得栈的长度
     26 int StackTraverse(SqStack *S);//自顶向下遍历栈
     27 int ClearStack(SqStack *S);//清空栈中的元素
     28 
     29 //初始化栈
     30 int InitStack(SqStack *S) {
     31     S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
     32     if(!S->base) {
     33         exit(OVERFLOW);
     34     }
     35     S->top = S->base;
     36     S->stacksize = STACK_INIT_SIZE;
     37 
     38     return OK;
     39 }
     40 
     41 //取得栈顶元素
     42 int GetTop(SqStack *S,SElemType *e) {
     43     if(S->top == S->base) {
     44         return ERROR;
     45     }
     46     *e = *(S->top-1);
     47     return OK;
     48 }
     49 
     50 //清空栈中的元素
     51 int ClearStack(SqStack *S) {
     52     S->top = S->base;
     53     return OK;
     54 }
     55 //入栈
     56 int Push(SqStack *S,SElemType e) {
     57     if((S->top-S->base)>=S->stacksize) {
     58         S->base = (SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));
     59         if(!S->base) exit(OVERFLOW);
     60         S->top = S->base + S->stacksize;
     61         S->stacksize += STACKINCREMENT;
     62     }
     63     *S->top++ = e;
     64     return OK;
     65 }
     66 
     67 //删除栈中的元素
     68 int Pop(SqStack *S,SElemType *e) {
     69     if(S->top  == S->base) return ERROR;
     70     *e = *--S->top;
     71     return OK;
     72 }
     73 
     74 //销毁栈
     75 int DestoryStack(SqStack *S) {
     76     S->top = S->base;
     77     free(S->base);
     78     S->top = NULL;
     79     S->base = NULL;
     80     return OK;
     81 }
     82 
     83 //判断栈是否为空
     84 int StackEmpty(SqStack *S) {
     85     if(S->top == S->base) {
     86         return OK;
     87     }
     88     return ERROR;
     89 }
     90 
     91 //取得栈的长度
     92 int StackLength(SqStack *S) {
     93     return S->top-S->base;
     94     /*int i=0;
     95     if(!StackEmpty(S)) {
     96         while(S->top!=S->base) {
     97             i++;
     98             S->top--;
     99         }
    100     }
    101     return i;*/
    102 }
    103 
    104 //自顶向下遍历栈
    105 int StackTraverse(SqStack *S) {
    106     SElemType *p;
    107     if(S->base!=S->top) {
    108         printf("栈中自顶向下的元素为:");
    109         p = S->top;
    110         while(p!=S->base) {
    111             p--;
    112             printf("%d ",*p);
    113         }
    114     } else {
    115         printf("栈为空!
    ");
    116         return ERROR;
    117     }
    118     printf("
    ");
    119     return OK;
    120 }
    121 
    122 int main()
    123 {
    124     SqStack sq;
    125     int f1,f2,e,f3,i,n,a,f4,f5,len,f6,f7,f8;
    126     //初始化栈
    127     f1 = InitStack(&sq);
    128     if(f1) printf("初始化栈成功!
    ");
    129     else printf("初始化栈失败!
    ");
    130 
    131     //入栈
    132     printf("请输入栈中元素的个数:");
    133     scanf("%d",&n);
    134     printf("请输入栈中元素:");
    135     for(i=0; i<n; i++) {
    136         scanf("%d",&a);
    137         Push(&sq,a);
    138     }
    139 
    140     //取得栈顶元素
    141     f2 = GetTop(&sq,&e);
    142     if(f2) printf("栈顶元素为:%d
    ",e);
    143     else printf("栈为空!无栈顶元素!
    ");
    144 
    145     //判断栈是否为空
    146     f5 = StackEmpty(&sq);
    147     if(f5) printf("栈为空!
    ");
    148     else printf("栈不为空!
    ");
    149 
    150     //删除栈中的元素
    151     f6 = Pop(&sq,&e);
    152     if(f6) {
    153         printf("删除的元素为:%d
    ",e);
    154     }
    155 
    156     //取得栈的长度
    157     len = StackLength(&sq);
    158     printf("栈的长度为:%d
    ",len);
    159 
    160     //自顶向下遍历栈
    161     StackTraverse(&sq);
    162 
    163     f8 = ClearStack(&sq);
    164     if(f8) printf("清空栈成功!
    ");
    165     else printf("清空栈失败!
    ");
    166 
    167     //销毁栈
    168     f4 = DestoryStack(&sq);
    169     if(f4) printf("销毁栈成功!
    ");
    170     else printf("销毁栈失败!
    ");
    171 
    172 
    173     return 0;
    174 }
  • 相关阅读:
    正则表达式
    HashTable与HashMap的区别
    求解连续子数组乘积的最大值
    求解N个值中最大的k个数,N远大于k
    C++权限修饰符
    DBSCAN算法
    【leetcode】1318. Minimum Flips to Make a OR b Equal to c
     【leetcode】1317. Convert Integer to the Sum of Two No-Zero Integers
    【leetcode】1316. Distinct Echo Substrings
    【leetcode】1315. Sum of Nodes with Even-Valued Grandparent
  • 原文地址:https://www.cnblogs.com/chengzi123/p/4348847.html
Copyright © 2020-2023  润新知