【数据结构】顺序栈与链栈

栈的特点是后进先出或先进后出,简称LIFO或FILO,通常top时刻表示栈顶的位置序号,一般空栈时top=-1;入栈栈顶指针加1,s->top++;出栈栈顶指针减1,s->top--

【顺序栈】

定义:

typedef struct

{

int date[MAX];

int top;

} SeqStack,*Stack;

置空栈:

Stack Init_SeqStack()//置空栈

{

Stack s;

s=(SeqStack*)malloc(sizeof(SeqStack));

if(!s)

{

printf("空间不足\n");

return NULL;

}

else

{

s->top = -1;

return s;

}

}

判断是否为空栈:

int Empty_Stack(Stack s)//判断是否空栈

{

if (s->top == -1)

return 1;

else

return 0;

}

进栈:

int Push_SeqStack(SeqStack* s,int x)//进栈

{

if (s->top == MAX - 1)

{

printf("栈满!");

return 0;

}

else

{

s->top++;

s->date[s->top] = x;

return 1;

}

}

出栈:

int Pop_SeqStack(SeqStack* s,int* x)//出栈

{

if (s->top == -1)

return 0;

else

{

*x = s->date[s->top];//(上面定义了一个指针,用指针来接受数据)

s->top--;

return 1;

}

}

输出栈中元素:

int printStack(Stack s)//输出

{

int top = s->top;

while (top != -1)

printf("%4d", s->date[top--]);

printf("\n");

return 0;

}

int GetTop(Stack s)

{

int top = s->top;

return s->date[top];

}

输出栈顶:

int GetTop(Stack s)

{

int top = s->top;

return s->date[top];

}

以下为一个顺序栈,实现栈的入栈、出栈并将其中元素输出功能

cs 复制代码
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct
{
	int date[MAX];
	int top;
} SeqStack,*Stack; //SeqStack*==Stack
Stack Init_SeqStack()//置空栈 
{
	Stack s;
	s=(SeqStack*)malloc(sizeof(SeqStack));
	if(!s)
	{
		printf("空间不足\n");
		return NULL;
	}
	else
	{
		s->top = -1;
		return s;
	}
}
int Empty_Stack(Stack s)//判断是否空栈 
{
	if (s->top == -1)
		return 1;
	else
		return 0;
}
int Push_SeqStack(Stack s,int x)//进栈 
{
	if (s->top == MAX - 1)
	{
		printf("栈满!");
		return 0;
	}
	else
	{
		s->top++;
		s->date[s->top] = x;
		return 1;
	}
}
int Pop_SeqStack(Stack s,int* x)//出栈  
{
	if (s->top == -1)
		return 0;
	else
	{
		*x = s->date[s->top];//(上面定义了一个指针,用指针来接受数据) 
		s->top--;
		return 1;
	}

}
int printStack(Stack s)//输出 
{
	int top = s->top;
	while (top != -1)
		printf("%4d", s->date[top--]);
	printf("\n");
	return 0;
}
int GetTop(Stack s)
{
	
	int top = s->top;
	return s->date[top];
}
int main()
{
	Stack s;
	int x;
	s=Init_SeqStack();
	Empty_Stack(s);
	printf("请输入入栈数字:\n");
	scanf("%d", &x);
	while (x != 0)
	{
		Push_SeqStack(s,x);
		printf("请输入入栈数字:\n");
		scanf("%d", &x);
	}
	printStack(s);
	printf("栈顶:%d\n",GetTop(s));
	printf("出栈测试:");
	Pop_SeqStack(s,&x);//这个函数上面x定义的为指针,所以要加取地址符 
	printStack(s);
	return 0;
}

【链栈】

定义:

typedef struct node

{

int date;

struct node* next;

}StackNode, * LinkStack;

实现链栈的入栈、出栈并将其中元素输出功能

cs 复制代码
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	int date;
	struct node* next;
}StackNode, * LinkStack;
void Init_LinkStack(LinkStack &p)//初始化 
{
	p = (LinkStack)malloc(sizeof(StackNode));
	p->date = 0;
	p->next = NULL;
}
int Empty_LinkStack(LinkStack top)
{
	if (top == NULL)
		return 1;
	else
		return 0;
}
void Push_LinkStack(LinkStack &top, int x)//入栈 
{
	LinkStack s;
	s = (LinkStack)malloc(sizeof(StackNode));
	s->date = x;
	s->next = top->next;
	top->next = s;
}
LinkStack Pop_LinkStack(LinkStack &top, int &x)//出栈 
{
	LinkStack p;
	if (top->next == NULL)
		return NULL;
	else
	{
		p = top->next;
		x = p->date;
		top->next = p->next;
		free(p);
		return top;
	}
}
int GetTop(LinkStack s, int x)//栈顶
{
	if (s->next == NULL)
		return NULL;
	x = s->next->date;
	return x;
}

void printStack(LinkStack top)//输出 
{
	while (top != NULL)
	{
		printf("%4d", top->date);
		top = top->next;
	}
	printf("\n");
}
int main()
{
	LinkStack top;
	int x=0;
	Init_LinkStack(top);
	Empty_LinkStack(top);
	printf("请输入入栈元素:\n");
	scanf("%d", &x);
	while (x != 0)
	{
		Push_LinkStack(top, x);
		printf("请输入入栈元素:\n");
		scanf("%d", &x);
	}
	printStack(top);
	printf("栈顶为:%d\n", GetTop(top, x));
	printf("出栈测试:\n");
	Pop_LinkStack(top, x);
	if (top != NULL)
	{
		printStack(top);
	}
	else
		printf("栈空,无法输出!");
	return 0;
}

注意:链栈中的top是我所定义的一个指针,与顺序栈不同

求助:在链栈的代码中,输出栈中元素时,一直会在输出栈中元素的前端出现一个0(我在初始化函数中,将p->date赋初值为0),如何修改代码

相关推荐
工业甲酰苯胺1 分钟前
聊一聊 C#线程池 的线程动态注入
java·开发语言·c#
zfenggo2 分钟前
c/c++ 无法跳转定义
c语言·开发语言·c++
向宇it12 分钟前
【从零开始入门unity游戏开发之——C#篇30】C#常用泛型数据结构类——list<T>列表、`List<T>` 和数组 (`T[]`) 的选择
java·开发语言·数据结构·unity·c#·游戏引擎·list
keep-learner13 分钟前
Unity Dots理论学习-2.ECS有关的模块(1)
学习·unity·游戏引擎
hakesashou17 分钟前
python怎么看矩阵维数
开发语言·python
daopuyun26 分钟前
GB/T34944-2017 《Java语言源代码漏洞测试规范》解读——安全功能
java·开发语言·安全
A懿轩A33 分钟前
C/C++ 数据结构与算法【树和二叉树】 树和二叉树,二叉树先中后序遍历详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·二叉树·
qh0526wy37 分钟前
pyqt5冻结+分页表
开发语言·python·qt
虾球xz44 分钟前
游戏引擎学习第62天
学习·游戏引擎
hjxxlsx44 分钟前
探索 C++ 自定义函数的深度与广度
开发语言·c++