• 数据结构 实验二 栈


    数据结构 实验二  栈

    首先,头文件与实验一相同,这里就不再赘述。可以参考实验一的头文件。

    栈操作的相关实验代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    /*包含数据结构的预定义常量和类型P10 */
    #include "DataHead.h"
    /*文件名大于8位出错*/
    
    /*定义元素类型为整数类型*/
    typedef int SElemType;
    
    /*栈的顺序存储表示*/
    #define STACK_INIT_SIZE 4      /*  p46 */
    
    #define STACKINCREMENT 1
    
    typedef struct{
        SElemType *base;
        SElemType *top;
        int       stacksize;
    }SqStack;
    
    /*函数申明*/
    Status InitStack(SqStack *L);   /*  p47 */
    Status GetTop(SqStack S,SElemType *e);
    Status Push(SqStack *L, SElemType e);   /* 进栈,插入 */
    Status Pop(SqStack *L, SElemType *e);   /*  出栈,删除*/
    void Out_Stack(SqStack L);    /*补充,输出打印栈*/
    
    /*主函数*/
    void main()
    {
     int i,k,loc;     /* k ,菜单控制变量*/
     SElemType e,x;
     char ch;
     SqStack L;
     SqStack *p;
     system("graftabl 936");/*调用MS_DOS中文支持*/
     p=&L;/*p指向 L*/
     do{
    
        printf("
    
    
    ========实验二:栈和队列 ===============");
        printf("
            1.建立栈:构造一个空栈,并插入元素");
        printf("
            2.入栈,插入元素");
        printf("
            3.出栈,删除元素");
        printf("
            4.取栈顶元素");
        printf("
            5.输出显示栈内元素,从栈底到栈顶");
        printf("
            0.结束程序运行");
        printf("
    =====================================");
        printf("
            请输入您的选择(1,2,3,4,0)
    ");
    
        scanf("%d",&k);
        switch(k)
        {
         case 1:{loc=InitStack(p);
                printf("
    请输入入栈元素个数,并依次输入整数类型的元素值");
                scanf("%d",&loc);
                for(i=1;i<=loc;i++) {
                   scanf("%d",&e);
                   Push(p, e);  /*也可以不处理函数返回值*/
                   }
                Out_Stack(L);
                }break;
         case 2:{ 
             printf("
    请输入入栈元素的值:");
             scanf("%d", &e);
             Push(p,e);
             Out_Stack(L);
                }break;
         case 3:
             { 
                 printf("
    请输入出栈元素个数");
                 while(true)
                 {
                     scanf("%d", &loc);
                     if(loc > p->top-p->base)
                         printf("
    !!出栈元素个数大于栈内所有元素个数!请重新输入!
    ");
                     else
                         break;
                 }
                 printf("
    出栈元素为: ");
                 for(i = 1; i <= loc; i++)
                 {
                     Pop(p, &e);
                     printf("%8d ", e);
                 }
                 Out_Stack(L);
             }break;
         case 4:
             {
                 GetTop(L, &e);
                 printf("当前栈顶元素为: %d", e);
             }; break;
         case 5:{Out_Stack(L);
                }; break;
         case 0:{exit(0);}
        }
      }while(k!=0);
      ch =getchar();
    }
    
    
    
    
    Status InitStack(SqStack *S) {  /*  p47 */
      /*  构造一个空栈 */
      S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
      if (!S->base) exit(OVERFLOW);        /*  存储分配失败 */
      S->top = S->base;
      S->stacksize = STACK_INIT_SIZE;   /*  初始存储容量 */
      return OK;
    } /*  InitStack */
    
    Status GetTop(SqStack S, SElemType *e) {  /*  p47 */
        if(S.base == S.top)        return ERROR;
        e = S.top - 1;
        return OK;
    } /*  GetTop */
    
     
    Status Push(SqStack *S, SElemType e) {  /*  P47 */
    
      if (S->top-S->base >= S->stacksize) {   /*  当前存储空间已满,增加容量 */
        S->base = (SElemType *)realloc(S->base,
                      (S->stacksize+STACKINCREMENT)*sizeof (SElemType));
        if (!S->base) exit(OVERFLOW);   /*  存储分配失败 */
        S->top = S->base+S->stacksize;
        S->stacksize += STACKINCREMENT;  /*  增加存储容量 */
      }
      *S->top++ = e;       /* 个人的一些补充说明:由于栈中的top指针指向栈中即将赋值的空闲存储地址,所以先将e的值赋给top指针所指向的存储空间,然后再将top指针向后移动一位*/
      return OK;
    } /*  Push */
    
    
    void Out_Stack(SqStack L){
        int *i;
        printf("
    当前栈内元素从栈底到栈顶为:");
        for(i=L.base;i<L.top;i++) printf("%10d",*i);
    }
    
    Status Pop(SqStack *S, SElemType *e) {  /*  p47 */
        if(S->base == S->top)
            return ERROR;
        *e = *--S->top;
        return OK;
    } /*  Pop */

    可以复制上述代码,也可以去我的网盘下载cpp源文件。

    http://pan.baidu.com/s/1mWOwO 

  • 相关阅读:
    数组
    做了个进制转换图
    类的练习
    3.10l练习
    c#学习第二课
    c#第四课习题
    c#学习第三课
    学习PHP&MYSQL之——字符编码篇(一)
    中缀表达式转换成后缀表达式
    模板方法模式(Template Pattern)
  • 原文地址:https://www.cnblogs.com/uppercloud/p/DataStructure_Stack.html
Copyright © 2020-2023  润新知