栈的顺序存储结构

栈的顺序存储结构的实现

1)编写完成下列功能的函数:(1)初始化一个栈;(2)在已经初始化的基础上,创建一个包含 5 个不大于 100 的正整数值的栈(5 个值由计算机随机产生);(3)将一个数 x 插在栈顶(x 在程序运行时输入);( 4)将栈顶元素弹出, 并在弹出结束后输出弹出元素的值;(5)求栈中元素的个数;(6)输出从栈顶到栈底的所有元素。

栈的顺序存储结构定义

#define MAXSIZE 100 // 存储空间初始分配量
typedef struct {
SElemType *base; //栈底指针
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
} SqStack;

顺序栈的插入和删除时,要判断栈空和栈满。

栈空:S.top = S.base;
栈满:S.top - S.base = S.stacksize
栈长:S.top - S.base

栈空时,S.top、S.base同时指向栈底。
入栈时,先将元素放到S,top所指的内存空间中,然后让S.top+1(上移)。
出栈时,栈顶元素为*(S.top-1),直接S.top-1(下移),即删除栈顶元素。

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef struct{
	int *base;
	int *top;
	int stacksize;
}SqStack;

int InitStack(SqStack &S);
void CreateStack(SqStack &L);
int Push(SqStack &S,int x);
int Pop(SqStack &S,int &x);
int StackLength(SqStack S);
int PrintStack(SqStack S);

int InitStack(SqStack &S)
{//初始化
	S.base= (int*)malloc(MAXSIZE *sizeof(int));
	if(!S.base)  
		return ERROR;
	S.top = S.base;//栈空
	S.stacksize= MAXSIZE;
	return OK;
}
void CreateStack(SqStack &S)
{//创建
	int i,a;
	printf("栈的长度为:");
	scanf("%d",&a);
	srand((unsigned)time(NULL));
	for(i = 0;i < a;i++ )
	    *S.top++= rand() % 100 +1;//相当于*S.top=rand() % 100 +1;S.top++;
}
int Push(SqStack &S,int x)
{//插入
	if (S.top-S.base==S.stacksize)  
		return ERROR; //栈满
	*S.top++ = x;     //相当于*S.top=x;S.top++;
	return OK;
}
int Pop(SqStack &S,int &x)
{//出
	if(S.top==S.base) 
		return ERROR;
	x = *--S.top;//相当于--S.top;x=*S,top;
	return OK;
}
int StackLength(SqStack S)
{//栈长
	return S.top - S.base ;
}
int PrintStack(SqStack S)
{//遍历
	for(int i = 0;S.top - i != S.base;i++)//判断条件为栈不为空时
		printf("%d ",*(S.top - 1 -i ));//遍历时,栈顶指针未变
	return OK;
	/*
	也可以这样遍历
	for(int i = 1;i <= S.top - S.base;i++)
		printf("%d ",*(S.top - i));//遍历时,栈顶指针未变
	return OK;
	*/
}
int main()
{
	int a,k,f,x,i,e;
	SqStack S;
	for(k = 0;;k++)
	{
        printf("\n1.初始化一个顺序栈\n");
		printf("2.创建一个正整数的顺序栈\n");
		printf("3.插入某个元素到栈顶\n");
		printf("4.删除某个栈顶元素\n");
		printf("5.求顺序栈长\n");
		printf("6.遍历元素\n");
		printf("7.退出程序\n");
		printf("输入你的选择:\n");
		scanf("%d",&a);
		switch (a)
		{
		    case 1:
				f = InitStack(S);
				if(f == 1)
					printf("创建顺序栈成功!\n");
				break;
			case 2:
				CreateStack(S);
				PrintStack(S);
				break;
			case 3:
				printf("你想插入的数为:");
				scanf("%d",&x);
				 Push(S,x);
				PrintStack(S);break;
			case 4:
				e = Pop(S,x);
				printf("删除栈顶元素为:%d\n",e);
				PrintStack(S);break;
			case 5:
				 i = StackLength(S);
				 printf("栈长为:%d",i);break;
			case 6:PrintStack(S);break;
			case 7:exit(0);
		}
	}
	return OK;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值