栈顺序存储&链式存储


1.栈的顺序存储之动态存储

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

#define OK 1
#define FALSE 0
#define TRUE 1
#define STACK_INIT_SIZE 20 //存储空间初始分配量
#define STACKINCREMENT 5 //存储空间分配增量

typedef int SELemType;
typedef int Status;
typedef struct
{
	SELemType *base;
	SELemType *top;
	int stacksize;	//当前已分配的存储空间
}SqStack;

Status InitStack(SqStack *S)//构造一个空栈
{
	S->base = (SELemType *)malloc(STACK_INIT_SIZE*sizeof(SELemType));
	S->top = S->base;
	S->stacksize = STACK_INIT_SIZE;
	return OK;
}

Status Push(SqStack *S, SELemType e)//入栈
{
	if (S->top - S->base >= S->stacksize)
	{
		S->base = (SELemType *)realloc(S->base, (S->stacksize + STACKINCREMENT)*sizeof(SELemType));
		if (!S->base) exit(0);
		S->top = S->stacksize+S->base;
		S->stacksize += STACKINCREMENT;
	}
	*(S->top) = e;
	S->top++;//插入新元素后,top指针+1
	return OK;
}


Status GetTop(SqStack *S, SELemType *e)//用e返回栈顶元素
{
	if (S->top == S->base) return FALSE;//栈为空
	*e = *(S->top -1);
	return OK;
}

Status Pop(SqStack *S,SELemType *e)//删除栈顶元素,用e返回其值
{
	if (S->top == S->base) return FALSE;
	*e = *(S->top - 1);
	S->top--;
	return OK;
}

int StackLength(SqStack *S)
{
	return S->top - S->base; //地址指针相减,结果并不是地址差,而是实际元素的差值。
}
Status ClearStack(SqStack *S)
{
	S->top = S->base;
	return OK;
}

Status DestroyStack(SqStack *S)
{
	free(S->base);
	S->base = S->top = NULL;
	S->stacksize = 0;
	return OK;
}

int main()
{
	SqStack S;
	int cord;
	Status result;
	do
	{
		printf("\n1.初始化栈\n");
		printf("2.入栈\n");
		printf("3.输出栈顶元素\n");
		printf("4.删除栈顶元素\n");
		printf("5.元素个数即栈的长度\n");
		printf("6.清空栈\n");
		printf("7.销毁栈\n");
		scanf_s("%d", &cord);
		switch (cord)
		{
			case 1:
			{
				  result = InitStack(&S);
				  if (result == OK)printf("初始化栈成功\n");
				  else printf("初始化失败\n");
			}break;
			case 2:
			{
					  int e;
				    printf("输入要插入的元素e\n");
					scanf_s("%d", &e);
			        result = Push(&S, e);
					if (result == OK)printf("成功插入%d\n", e);
					else printf("初始化失败\n");
			}break;
			case 3:
			{
					  int e;
					  result = GetTop(&S, &e);
					  if (result == OK)  printf("栈顶元素为%d\n", e);
					  else printf("空栈");
			}break;
			case 4:
			{
					  int e;
					  result = Pop(&S, &e);
					  if (result == OK) printf("栈顶元素%d已删除\n", e);
					  else  printf("空栈");
			}break;
			case 5:
			{
					  int length;
					  length = StackLength(&S);
					  printf("栈的长度为%d\n", length);
			}break;
			case 6:ClearStack(&S); break;
			case 7:DestroyStack(&S); break;
		
		}
	} while (cord > 0 && cord <= 7);
	return 0;
}


另一种较简单的写法


//用数组的话不用销毁,没用指针不用销毁,好像是自动销毁
<pre name="code" class="cpp">#include<stdio.h>  
#include<stdlib.h>  
#define MAX 20  

typedef struct SqStack
{
	int elem[MAX];
	int top;//栈顶指针  
}SqStack;
int InitStack(SqStack *S)
{
		S->top = -1; printf("置空栈成功\n");

	return 1;
}
int Push(SqStack *S)
{
	//在栈顶插入新元素x,返回1表示入栈成功,返回0表示失败  
	int n;
	if (S->top == MAX - 1){ printf("栈满不能入栈\n"); return 0; }
	else
	{
		printf("输入要入栈的数据个数"); scanf_s("%d", &n);
		printf("输入要入栈的元素: ");
		while (S->top < n - 1)
		{
			S->top++;
			scanf_s("%d", &(S->elem[S->top]));
		}
		printf("Push success\n");
		return 1;
	}
}
int Get_SqStack(SqStack *S, int *e)
{
	//用e栈顶元素,成功返回1,失败返回0  
	if (S->top == -1){ printf("栈是空的"); return 0; }
	else
		*e = S->elem[S->top];
	return 1;
}
int Pop_SqStack(SqStack *S, int *e)
{
	//删除栈顶元素,用tmp返回其值,返回值为1表示出栈成功,为0表示出栈失败  
	if (S->top == -1){ printf("栈是空的"); return 0; }
	else (*e = S->elem[S->top]);
	S->top--;
	return 1;
}
void outline(SqStack *S)
{
	for (int i = S->top; i >= 0; i--)
		printf("%2d", S->elem[i]);
}
int main()
{
	int cord, data, flag;
	SqStack S;
	do{
		printf("\n1栈的初始化     \n");
		printf("2数据入栈   \n");
		printf("3出栈 \n");
		printf("4取栈顶元素\n");
		printf("5输出栈中元素\n");
		scanf_s("%d", &cord);
		switch (cord)
		{
		case 1:{  InitStack(&S);   }break;
		case 2:{  Push(&S); }break;
		case 3:{
				   flag = Pop_SqStack(&S, &data);
				   if (flag == 1)printf("出栈的元素为%d", data);
		}break;
		case 4:{  flag = Get_SqStack(&S, &data);
			if (flag == 1)printf("当前栈顶元素为%d", data);
		}break;
		case 5:{  outline(&S); }break;

		}
	} while (cord <= 5 && cord > 0);
	return 0;
}

 

栈的链式存储(双结构体)

#include <stdio.h>
#include <stdlib.h>
#define Status int
#define OK 1

typedef struct StackNode//定义栈结点的结构
{
	int data;
	struct StackNode *next;
}StackNode;

typedef struct LinkStack//定义栈
{
	StackNode *top;
	int count;
}LinkStack;

Status Initlist(LinkStack *S2)//初始化栈
{
	S2->top = (StackNode *)malloc(sizeof(StackNode));
	//S2 = (LinkStack *)malloc(sizeof(LinkStack));
	S2->top = NULL;
	S2->count = 0;
	return OK;
}
Status Push(LinkStack *S2, int x)//入栈
{
	StackNode *p;
	p = (StackNode *)malloc(sizeof(StackNode));
	p->data = x;
	p->next = S2->top;
	S2->top = p;
	S2->count++;
	return OK;
}

Status Pop(LinkStack *S2, int *e)//删除栈顶元素,用e返回其值
{
	StackNode *p;
	*e = S2->top->data;
	p = S2->top;
	S2->top = S2->top->next;
	free(p);
	S2->count--;
	return OK;
}
Status StackEmpty(LinkStack *S2)//判断栈空
{
	if (S2->count == 0) return 1;
	else return 0;
}
Status ClearStack(LinkStack *S2)
{
	StackNode *p, *q;
	p = S2->top;
	while (p)
	{
		q = p;
		p = p->next;
		free(q);
	}
	S2->count = 0;
	return OK;
}
void Outline(LinkStack *S2)
{
	StackNode *p;
	p = S2->top;
	while (p)
	{
		printf(" %d ", p->data);
		p =p->next;
	}
	printf("\n");
}
int main()
{
	int cord, result;
	LinkStack S2;
	do
	{
		printf("\n1.初始化\n");
		printf("2.入栈\n");
		printf("3.出栈\n");
		printf("4.显示\n");
		printf("5.置空栈\n");
		printf("6.判栈空\n");
		scanf_s("%d", &cord);
		switch (cord)
		{
		case 1:
		{
				  result = Initlist(&S2);
				  if (result == OK) printf("初始化成功\n");
		}break;
		case 2:
		{
				  int x;
				  printf("输入要入栈的元素:");
				  scanf_s("%d", &x);
				  result = Push(&S2, x);
				  if (result == OK) printf("成功入栈\n");
		}break;
		case 3:
		{
				  int e;
				  result = Pop(&S2, &e);
				  if (result == OK)printf("元素%d出栈\n", e);
		}break;
		case 4:
		{
				  Outline(&S2);
		}break;
		case 5:if (ClearStack(&S2) == OK) printf("清空栈成功\n"); break;
		case 6:
		{
				  result = StackEmpty(&S2);
				  if (result == OK)
				  printf("是空栈\n"); 
				  else
					  printf("不是空栈\n");
		}break;
		}
	} while (cord<9);

	return 0;
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值