设栈采用顺序存储结构(用动态数组),请编写栈的各种基本操作的实现函数
提示:
⑴ 栈的动态数组顺序存储结构可定义如下:
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");
}
运行结果: