栈 顺序和链式

#define Maxsize 20
#include<stdio.h>
#include<stdlib.h>
#define Elemtype int
typedef struct {
	int stacksize;//指当前栈的存储最大容量
	Elemtype* base;//开始指向栈底元素
	Elemtype* top;//指向栈顶元素的下一个位置
}Sqstack;
void Traverse(Sqstack S) {
	printf("\n栈中元素为");
	for (Elemtype* p = S.base; p < S.top; p++) {
		printf("%d ", *p);
	}
}
void InitStack(Sqstack& S) {
	S.base = new Elemtype[Maxsize];
	if (!S.base)
		return;
	S.top = S.base;
	S.stacksize = Maxsize;
}
bool StackEmpty(Sqstack S) {
	return(S.top == S.base);
}
int StackLength(Sqstack S) {
	return (S.top - S.base);
	//两个指针相减表示的是这两个指针所对应的地址之间在内存中相隔多少
}
void Push(Sqstack& S, int e) {
	if (S.top - S.base == S.stacksize)
		return;
	*S.top = e;
	*S.top++;
}
int GetTop(Sqstack S, int &e) {
	if (StackEmpty(S))
		return 0;
	e = *(S.top-1);
	return e;
}
void Pop(Sqstack& S, int& e) {
	if (StackEmpty(S))
		return;
	e = *S.top - 1;
	S.top--;
}
void DestroyStack(Sqstack& S) {
	if (S.base) {
		delete S.base;
		S.stacksize = 0;
		S.top = NULL;
		S.base = NULL;
	}	
}
void ClearStack(Sqstack& S) {
	if (S.base)
		S.top = S.base;
}
bool StackFull(Sqstack& S) {
	return (StackLength(S) == S.stacksize);
}
int main() {
	int n;
	int e;
	Sqstack S;
	InitStack(S);
	printf("请输入栈中元素个数:\n");
	scanf_s("%d", &n);
	for (int i = 0; i < n; i++) {
		printf("栈中第%d个元素为:\n", i + 1);
		scanf_s("%d", &e);
		Push(S, e);
	}
	Traverse(S);
	printf("栈顶元素为%d\n", GetTop(S, e));
	Pop(S, e);
	Traverse(S);
	printf("Stacklength=%d\n", StackLength(S));
	ClearStack(S);
	Traverse(S);
	if (StackFull(S))
		printf("\n满栈");
	else
		printf("\n非满栈");
}

算法分析:

        Push:就是向栈中压入一个元素 同时top指针上移

        Pop:将栈中top元素弹出 此时top指针下移 将*top赋给新元素

        GetTop:只获取top元素的值

        StackLength: 由于top指针指向top原宿的上方一个元素 而base指向最底下的元素

                所以在求长度时只需要将二者相减 返回ElemType对应的指针相差的倍数 即长度

出入栈顺序:

        如果一个栈的输入序列为123456,能否得到435612和135426的出栈序列?

需要注意的是 进栈顺序和出栈顺序不可以相同 如435612中的12就不符合 只可以逆序

链栈:

        与顺序栈相比 链栈不会存在内存溢出或者栈容量不够的情况 其本质还是一个单链表

 要使用头插法来模拟入栈

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define Elemtype char
typedef struct node{
	Elemtype data;
	struct node* next;
}StackNode,*LinkStack;
void InitStack(LinkStack& S) {
	S = NULL;
}
//头插法 模拟栈原理
void Push(LinkStack& S, char c) {
	StackNode* p = new StackNode;
	if (!p){
		exit(OVERFLOW);
		printf("内存不足");
}
	p->data= c;
	p->next=S;
	S = p;
	return;
}
bool StackEmpty(LinkStack S) {
	return (S == NULL);
}
char Pop(LinkStack& S, char& c) {
	LinkStack p;
	p = S;
	c = S->data;
	S = S->next;
	delete p;
	return c;
}
char GetTop(LinkStack S, char& c) {
	if (StackEmpty(S))
		return 'NULL';
	c = S->data;
	return c;
}
void ClearStack(LinkStack& S) {
	while (S!= NULL)
		S = NULL;
}
void DestroyStack(LinkStack& S) {
	while (S!= NULL) {
		S = NULL;
		delete S;
	}
}
void Traverse(LinkStack S) {
	if (S == NULL)
		printf("\n空栈");
	while (S!= NULL){
		printf("%c ", S->data);
		S = S->next;
	}
}
int main() {
	char c;
	LinkStack S;
	InitStack(S);
	Push(S, '1');
	Push(S, '2');
	Push(S, '3');
	Push(S, '4');
	Traverse(S);
	printf("弹出元素%c", Pop(S, c));
	printf("\n栈顶元素为%c ", GetTop(S, c));
	ClearStack(S);
	Traverse(S);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值