欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

顺序栈,链式栈的操作(c语言实现)

程序员文章站 2022-06-05 14:59:41
...

顺序栈

定义:利用顺序储存结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的元素。
栈顶的位置不存放元素
操作
1.初始化栈
2.判断是否为空栈
3.向栈中压入元素
4.取栈顶元素
5.元素出栈
说明:取栈顶元素和元素出栈的本质是不同的,后面有代码说明
顺序栈,链式栈的操作(c语言实现)图片转自https://blog.csdn.net/qq_25775935/article/details/88558779

未存放元素时,top指向a[0]的位置,如果放入了一个元素,则top指向a[1]的位置

链式栈

定义:采用链式储存结构实现的栈,一般用单链表来表示。
栈的操作都是在栈顶进行的,所以要设置一个头结点,头结点中不存放数据
操作
同上
顺序栈,链式栈的操作(c语言实现)
图片转自:https://blog.csdn.net/qq_25775935/article/details/88558779

#pragma once
# include <stdio.h>
# include <stdlib.h>
# define MaxSize 10
//顺序栈
//---------------------------------------------------------
typedef struct stack
{
 	int data[MaxSize];
 	int top;
}Seqstack;
//初始化
int InitStack(Seqstack *S)
{
 	S->top = 0;
 	return 1;
}
//判断是否为空
int Stackempty(Seqstack *S)
{
 	if (S->top == 0)
  	return 1;
 	else
  	return 0;
}
//元素入栈,栈顶始终不能存放元素
void PushItemStack(Seqstack *S, int e)
{
 	if (S->top > MaxSize)
	 {
  		printf("栈已满,无法入栈!\n");
  		return;
 	}
 	else
	 {
 		 S->data[S->top] = e;
 		 S->top++;
	 }
}
//元素出栈
int PopStack(Seqstack* S,int *e)
{
	 if (Stackempty(S))
 	{
 		 printf("栈已空,无法删除元素!\n");
  		return 0;
 	}
 	else
 	{
 		 S->top--;
  		*e = S->data[S->top];
 		 return 1;
	 }
}
//取栈顶元素
int GetStackTop(Seqstack *S, int *e)
{
	 if (Stackempty(S))
 	{
 		 printf("栈已空,无法取栈顶元素!\n");
 		 return 0;
 	}
 	else
 	{
  		//注意:取栈顶元素并不是要让栈顶下移
  		//只要
 	 *e = S->data[S->top - 1];
  	return 1;
	 }
}
//--------------------------------------------------------
//链式栈
typedef struct NODE
{
 	struct NODE*next;
 	int data;
}SNODE;
void StackInit(SNODE *head)
{
	 head = (SNODE*)malloc(sizeof(NODE));
	 head->next = NULL;
}
int Stackempty(SNODE *head)
{
 	if (head->next == NULL)
 	{
 		 printf("栈已空!\n");
 		 return 1;
 	}
 	else
 	 return 0;
}
//元素入栈
void StackPush(SNODE *head, int e)
{
 	SNODE *t = (SNODE*)malloc(sizeof(NODE));
 	t->data = e;
	 t->next = head->next;
	 head->next = t;
}
//抛出栈顶
int StackTop(SNODE *head, int *e)
{
 	SNODE *t = (SNODE*)malloc(sizeof(NODE));
 	t = head->next;
 	*e = t->data;
	 return 1;
}
//出栈
int StackPop(SNODE *head, int *e)
{
 	if (Stackempty(head))
 	{
	  printf("栈已空,元素无法出栈!\n");
	  return 0;
	 }
	 else
	 {
 	 *e = head->data;
	  return 1;
	 }
}

主函数:

# include <stdio.h>
# include <stdlib.h>
# include "stack.h"
int main()
{
 	Seqstack S;
 	InitStack(&S);
 	int a[10];
 	printf("请输入数据!\n");
 	for (int i = 0; i < 10; i++)
 	{
  		scanf("%d", &a[i]);
  		PushItemStack(&S, a[i]);
 	}
	 printf("栈的长度为:%d\n", S.top);
	 printf("抛出栈顶元素!\n");
 	 int e;
	 GetStackTop(&S, &e);
	 printf("栈顶元素为:%d",e);
	 printf("\n");
	 printf("元素出栈!\n");
 	 int d;
	 for (int j = 0; j < 10; j++)
	 {
  		PopStack(&S, &d);
  		printf("%3d", d);
 	}
 	printf("------------------------------------------\n");
 	printf("将用链式栈!\n");
 	printf("请输入数据!\n");
 	SNODE *L;
 	L = (SNODE*)malloc(sizeof(NODE));
	StackInit(L);
 	int b[10];
 	for (int i = 0; i < 10; i++)
 	{
  		scanf("%d", &b[i]);
  		StackPush(L, b[i]);
 	}
 	printf("抛出栈顶元素!\n");
 	int m;
 	StackTop(L, &m);
 	printf("栈顶元素为:%d\n", m);
 	printf("元素出栈!\n");
 	L = L->next;
 	for (int i = 0; i < 10; i++)
 	{
  		StackPop(L, &m);
  		L = L->next;	//指针往后指
  		printf("%3d", m);
 	}	
 	system("pause");
 	return 0;
}

代码运行截图
顺序栈,链式栈的操作(c语言实现)