栈的简单实现

来源:互联网 发布:sql count group by 编辑:程序博客网 时间:2024/05/23 02:04

设栈采用顺序存储结构(用动态数组),请编写栈的各种基本操作的实现函数   

提示:

⑴ 栈的动态数组顺序存储结构可定义如下: 

  struct  Stack {

    ElemType  *base ; // 存储空间

    ElemType  *top;             // 栈顶指示器

    int MaxSize;            // 栈的最大长度

  };

⑵ 栈的基本操作可包括:

① void InitStack (Stack &S);    //构造一个空栈 S

② int EmptyStack (Stack S);   //若栈S为空栈返回1,否则返回0

③ void Push(Stack &S, ElemType item);   //元素 item进栈

④ ElemType Pop(Stack &S);    //S的栈顶元素出栈并返回

⑤ ElemType Peek(Stack S);   //取栈S的当前栈顶元素并返回

⑥ void ClearStack (Stack &S);   //清除栈s,使成为

代码如下:

#include<stdio.h>
#include<process.h>
#include<malloc.h>
#define maxsize 10
#define increment 10
typedef int elemtype;
typedef struct  stack {
    elemtype  *base ;  // 存储空间
    elemtype  *top;              // 栈顶指示器
    int Maxsize;            // 栈的最大长度
  }stack;
void InitStack (stack &s)   //构造一个空栈 S
{
 s.base=(elemtype*)malloc(maxsize*sizeof(elemtype));
 if(!s.base)  exit(0);
 s.top=s.base;
 s.Maxsize=maxsize;
}

int EmptyStack (stack &s)   //若栈S为空栈返回1,否则返回0
{
 if(s.top==s.base)
  return 1;
else
  return 0;

}


void Push(stack &s, elemtype item)   //元素 item进栈
{
 if(s.top-s.base>=s.Maxsize)  
 {
  s.base=(elemtype*)realloc(s.base,(s.Maxsize+increment)*sizeof(elemtype));
     if(!s.base) exit(0);
  s.top=s.base+s.Maxsize;
     s.Maxsize+=increment;
 }
 else                                       
  *s.top=item;
      s.top++;
}

elemtype pop(stack &s)    //栈S的栈顶元素出栈并返回
{
 elemtype e;
 if(s.top==s.base)
  exit(0);
 else
    s.top--;
    e=*(s.top);
    return e;
}


elemtype peek(stack &s)  //取栈S的当前栈顶元素并返回
{
 
elemtype e;
if(s.top==s.base)
  exit(0);
 else
    e=*(s.top-1);
    return e;
}
void clearstack (stack &s) //清除栈s,使成为空栈
{
   s.top=s.base;
}
void printfstack(stack &s)//输出栈内元素
{
  int i=0;
  if(s.base==s.top)
   {
    printf("空栈!");
    exit(0); 
      }
  else
   while(i<s.top-s.base)
   {
    printf("%3d",*(s.base+i));
    i++;
   }
}
int lengthstack(stack s)   //求栈内元素个数即栈长
{
 int len=s.top-s.base;
 return (len);
}
int main()
{
 stack s;
 elemtype x,n=0;
 InitStack(s);             //构建一个空栈
 printf("(1)构建一个空栈后\n");
 printf("是否为空栈:%s\n",(EmptyStack(s)==1?"是!":"否!"));
 printf("(2)输入n则插入元素1到n进栈\n");
 printf("\n输入n=");
 scanf("%d",&n);
 for(int i=1;i<=n;i++)
 {
  Push(s,i);
 }
 printf("是否为空栈:%s\n",(EmptyStack(s)==1?"是!":"否!"));
 x= peek(s);
 printf("(3)栈顶元素为:%d\n",x);
 printf("(4)栈的长度为:%d\n",lengthstack(s));
 printf("(5)输出栈内元素为:");
 printfstack(s);
 printf("\n(6)栈顶元素出栈并返回为%d\n:", pop(s) );
 printf("此时栈的长度为:%d\n",lengthstack(s));
 printf("输出此时的栈内元素为:");
 printfstack(s);
 printf("\n(7)清除栈后\n");
 clearstack (s); //清除栈,使成为空栈
 printf("是否为空栈:%s\n",(EmptyStack(s)==1?"是!":"否!"));
 system ("pause");

}

运行结果:

 

原创粉丝点击