栈的顺序存储优化版

栈的顺序存储C++实现

#include<iostream>
using namespace std;

#define Maxsize 100  //预先分配空间,这个数值根据实际需要预估确定;

typedef struct SqStack 
{
	int *base; //栈底指针
	int *top;  //栈顶指针
}SqStack;
bool InitStack(SqStack &S) //构造一个空栈S
{
	//base指向这个数组的第一个字节的地址,base也就是这个数组的名称
	S.base = new int[Maxsize];//为顺序栈分配一个最大容量为Maxsize的空间 
	if (!S.base)    //空间分配失败
	{	
		return false;
	} 
	S.top=S.base;  //top初始为base,空栈
	
	return true;
}

bool Push(SqStack &S, int e) // 插入元素e为新的栈顶元素
{
	if (S.top-S.base == Maxsize) //栈满
	{
		return false;
	}
	*(S.top++) = e; //元素e压入栈顶,然后栈顶指针加1,等价于*S.top=e; S.top++;
	
	return true;
}

bool Pop(SqStack &S, int &e) //删除S的栈顶元素,暂存在变量e中
{
	if (S.base == S.top) //栈空
	{
		return false;	
	}
	e = *(--S.top); //栈顶指针减1,将栈顶元素赋给e
	
	return true;
}

int GetTop(SqStack S) //返回S的栈顶元素,栈顶指针不变
{
	if (S.top != S.base)  //栈非空
	{
		return *(S.top - 1); //返回栈顶元素的值,栈顶指针不变	
	}
    else
    {
        return -1;	
    }
}
int main()
{
	int n,x;
	SqStack S;
	InitStack(S);//初始化一个顺序栈S
	cout <<"请输入元素个数n:" <<endl;
	cin>>n;
	cout <<"请依次输入n个元素,依次入栈:" <<endl;
	while(n--)
    {
		cin>>x; //输入元素
		Push(S, x);
	}
	cout <<"元素依次出栈:" <<endl;
	while(S.top!=S.base)//如果栈不空,则依次出栈
    {
        cout<<GetTop(S)<<"\t";//输出栈顶元素
        Pop(S, x);   //栈顶元素出栈
    }
    
	return 0;
}

栈的顺序存储C实现

#include <stdio.h>
#include <stdlib.h>

#define Maxsize 100

//使用指针来维护这个数组 
typedef struct SqStack
{
	int * base; //栈底指针
	int * top;  //栈顶指针
}SqStack;
//1.栈初始化
void InitStack(SqStack * S)
{
	//base指向这个数组的第一个字节的地址,base也就是这个数组的名称
	S->base = (int *)malloc(sizeof(int) * Maxsize); //分配容量Maxsize个int类型的空间
	if(NULL == S->base)
	{
		return;
	}
	S->top = S->base; //top初始为base,空栈
}

//2.入栈
void PushStack(SqStack * S, int e)
{
	if(S->top-S->base == Maxsize)//判断栈满 
	{
		return;
	}
	*(S->top) = e;	//S->top保存&base[0],通过解引用变成base[0] 
	S->top++;		//S->top保存&base[1], 以此类推 
} 

//3.出栈
void PopStack(SqStack * S, int * e)
{
	if(S->base == S->top)//判断栈空 
	{
		return;
	}
	S->top--;
	*e = *(S->top);  //在出栈时,先把出栈元素保存
}

//4.在出栈前获取栈顶元素
int GetTopStack(SqStack * S)
{
	if(S->base != S->top)
	{
		return *(S->top - 1);//只取元素的值,栈顶指针不变
	}
	else
	{
		return -1;
	}
} 

void test01()
{
	int n, m, e;
	SqStack S;
	InitStack(&S);
	
	printf("请输入元素的个数:\n");
	scanf("%d", &n);
	printf("依次输入元素:\n");
	while(n--)
	{
		scanf("%d", &m);
		PushStack(&S, m);
	}
	
	printf("元素依次出栈:\n");
	while(S.base != S.top)
	{
		e = GetTopStack(&S); 
		printf("%d ", e);    //等价于printf("%d ", m);	
		PopStack(&S, &m);
	}
}
int main()
{
	test01();
	
	printf("\n");
	system("pause");
	return 0;
}
posted @ 2020-11-15 17:17  小帅博客  阅读(185)  评论(0编辑  收藏  举报