zoukankan      html  css  js  c++  java
  • 栈的存储结构的实现(C/C++实现)

    存档

     1 #include "iostream.h"
     2 #include <stdlib.h>
     3 #define max 20
     4 typedef char elemtype;
     5 #include "stack.h"
     6 void main()
     7 {
     8     stack s;
     9     char x;
    10     cout<<"(1)初始化栈s
    ";
    11     initstack(s);
    12     cout<<"(2)栈为"<<(stackempty(s)?"":"非空")<<endl;
    13     cout<<"(3)依次输入字母序列,以'#'结束"<<endl;
    14     cin>>x;
    15     while(x!='#')
    16     {
    17         push(s,x);
    18         cin>>x;
    19     }
    20     cout<<"(4)栈为"<<(stackempty(s)?"":"非空")<<endl;
    21     cout<<"(5)栈长度stacklength(s):"<<stacklength(s)<<endl;
    22     cout<<"(6a)栈顶元素gettop(s)为:"<<gettop(s)<<endl;
    23     cout<<"(6b)栈顶元素gettop1(s,x)为:";
    24     gettop1(s,x);
    25     cout<<x<<endl;
    26     cout<<"(7)从栈顶到栈底元素printstack(s):";
    27     printstack(s);
    28     cout<<"(8)出栈pop1(s,x)的元素为:";
    29     pop1(s,x);
    30     cout<<x<<endl;
    31     cout<<"(9)出栈序列:";
    32     while(!stackempty(s))
    33     {
    34         cout<<pop(s)<<" ";
    35     }
    36     cout<<endl;
    37     cout<<"(10)栈为"<<(stackempty(s)?"":"非空")<<endl;
    38     cout<<"(11)依次进栈元素a,b,c
    ";
    39     push(s,'a');
    40     push(s,'b');
    41     push(s,'c');
    42     cout<<"(12)从栈顶到栈底元素printstack(s):";
    43     printstack(s);
    44     cout<<"(13)清空栈clearstack(s)
    ";
    45     clearstack(s);
    46     cout<<"(14)栈为"<<(stackempty(s)?"":"非空")<<endl;
    47     cout<<"(15)销毁栈"<<endl;
    48     destorystack(s);
    49     cout<<"(17)销毁栈后调用push(s,e)和printstack(s)"<<endl;
    50     push(s,'e');
    51     printstack(s);
    52 }
      1 struct stack
      2 {
      3     elemtype *base;//存栈元素
      4     elemtype *top;//栈顶指定器
      5     int stacksize;//栈的最大容量
      6 };
      7 void initstack(stack &s)
      8 {
      9     //构造一个空栈s
     10     s.base=new elemtype[max];//malloc()分配存储空间
     11     if(!s.base)
     12         exit(-2);//#define OVERFLOW -2 
     13     s.top=s.base;//空栈
     14     s.stacksize=max;//栈的存储容量
     15 }
     16 void clearstack(stack &s)
     17 {
     18     //清除栈s,使成为空栈
     19     s.top=s.base;//空栈栈顶指针和栈底指针相等
     20 }
     21 int stackempty(stack s)
     22 {
     23     //若栈s为空栈返回1,否则返回0
     24     if(s.top==s.base)
     25         return 1;//空栈返回1,非空返回0
     26     else
     27         return 0;
     28 }
     29 int stacklength(stack s)
     30 {
     31     //返回栈的长度
     32     return s.top-s.base;
     33 }
     34 void push(stack &s,elemtype e)
     35 {
     36     //元素e进栈
     37     if(!s.base)//栈不存在的处理
     38     {
     39         cout<<"栈不存在
    ";
     40         return;
     41     }
     42     if(s.top-s.base>s.stacksize)//栈满的处理
     43     {
     44         cout<<"栈已满!
    ";
     45         return;
     46     }
     47     *s.top=e;//元素e存进栈顶的位置
     48     s.top++;//栈顶指针指向栈顶元素的下一个位置
     49 }
     50 elemtype pop(stack &s)
     51 {
     52     //栈s的栈顶元素出栈并返回
     53     if(s.base==s.top)
     54     {
     55         cout<<"栈空,不能出栈
    ";
     56         exit(-2);
     57     }
     58     else
     59     {
     60         s.top--;//栈顶指针减1,下次进栈,会覆盖当前位置的值,相当于删除
     61         return *s.top;//返回栈顶元素的值
     62     }
     63 }
     64 int pop1(stack &s,elemtype &e)
     65 {
     66     //栈s的栈顶元素出栈并返回
     67     if(s.base==s.top)
     68     {
     69         cout<<"栈空,不能出栈
    ";
     70         return 0;
     71     }
     72     else
     73     {
     74         s.top--;//栈顶指针减1,下次进栈,会覆盖当前位置的值,相当于删除
     75         e=*s.top;
     76         return 1;//返回栈顶元素的值
     77     }
     78 }
     79 elemtype gettop(stack s)
     80 {
     81     //取栈s的当前栈顶元素并返回
     82     if(s.top==s.base)
     83     {
     84         cout<<"栈空,获取栈顶元素失败"<<endl;
     85         exit(-2);
     86     }
     87     else
     88         return *(s.top-1);//top指针-1的位置才是栈顶元素所在的位置
     89 }
     90 int gettop1(stack s,elemtype &e)
     91 {
     92     //取栈s的当前栈顶元素并返回
     93     if(s.top==s.base)
     94     {
     95         cout<<"栈空,获取栈顶元素失败"<<endl;
     96         return 0;
     97     }
     98     else
     99         e=*(s.top-1);
    100     return 1;//top指针-1的位置才是栈顶元素所在的位置
    101 }
    102 void printstack(stack s)
    103 {
    104     //输出栈中所有元素,但不出栈,不做任何修改
    105     int i;
    106     for(i=s.top-s.base-1;i>=0;i--)//总共s.top-s.base个元素,下标范围就是[0...(s.top-s.base-1)]
    107         cout<<s.base[i]<<" ";
    108     cout<<endl;
    109 }
    110 void destorystack(stack &s)
    111 {
    112     //销毁栈
    113     delete s.base;//销毁连续空间
    114     s.base=NULL;//指针赋空
    115     s.top=NULL;//指针赋空
    116     s.stacksize=0;//栈容量赋0
    117 }

    运行结果如下:

  • 相关阅读:
    学习英文之社区,博客及源码 转载
    Windows 的 80 端口被 System 进程占用解决方案
    MySQL 报错:Translating SQLException with SQL state '42000', error code '1064', message
    程序员如何写工作日志?
    log4j 配置文件参数说明
    Java 后端彻底解决跨域问题(CORS)
    常用正则表达式语法
    使用 windows 批处理指令(BAT文件)进行压缩文件(zip)解压操作
    使用 windows 批处理指令(BAT文件)进行文件删除、复制操作
    idea 关于高亮显示与选中字符串相同的内容踩过的坑
  • 原文地址:https://www.cnblogs.com/ECJTUACM-873284962/p/7750375.html
Copyright © 2011-2022 走看看