数据结构—链栈

1.链栈的表示

  • 链栈的存储结构与单链表的存储结构相同。由于栈是在栈顶进行删除和添加元素的,因此,将链表的首部作为栈顶是最方便的。而且没有必要像单链表那样为了操作简单而附加一个头结点。
  • 在链栈中注意指针的方向是从栈顶指向栈底
// 链栈的存储结构
typedef struct StackNode
{
    int data;
    struct StackNode *next;
}StackNode,*LinkStack;

2.链栈的初始化

int InitStack(LinkStack &S)
{
	S=NULL;  //将栈顶指针置空
	return 1; 
}

3.链栈进栈(在入栈前不必判断栈是否满)

  • 算法步骤
    • 1、为入栈元素e分配空间,用指针p指向。
    • 2、将新结点数据域置为e。
    • 3、将新结点插入栈顶。
    • 4、修改栈顶指针为p
  • 算法描述
int Push(LinkStack &S,int e)
{
    //元素e入栈
    StackNode *p;
    p=new StackNode;  // 生成新节点
    p->data=e;        // 将新节点数据域置为e
    p->next=S;        // 将新节点插入栈顶
    S=p;              // 修改栈顶指针
    return 1;        //链栈要注意指针的方向是从栈顶指向栈底的 
}

4.链栈出栈

  • 和顺序栈一样,链栈在出栈前也需要判断栈是否为空,不同的是,链栈在出栈后需要释放出栈元素的栈顶空间
  • 算法步骤
    • 1、判断栈是否为空,若空则返回 ERROR。
    • 2、将栈顶元素赋给e。
    • 3、临时保存栈顶元素的空间,以备释放。
    • 4、修改栈顶指针,指向新的栈顶元素。
    • 5、释放原栈顶元素的空间。
  • 算法描述
int Pop(LinkStack &S,int &e)
{
    if(S==NULL)
    {
        return 0;    // 栈空
    }
	
    e=S->data;      //将栈顶元素赋值给e
    StackNode *p;   
    p=S;              // 临时保存栈顶元素空间,准备释放
    S=S->next;     // 修改栈顶指针
    delete p;     // 释放原栈顶元素空间
    return 1;
}

5.取栈顶元素

  • 与顺序栈一样,当栈非空时,此操作返回当前栈顶元素的值,栈顶指针S保持不变。
int GetTop(LinkStack S)
{
    //返回S的栈顶元素,不修改栈顶指针
    if(S!=NULL)  // 栈非空
    return s->data;  // 返回栈顶元素的值,栈顶指针不变
}

6.代码实现

  • main.cpp
#include <iostream>

using namespace std;

// 链栈的存储结构
typedef struct StackNode
{
    int data;
    struct StackNode *next;
}StackNode, *LinkStack;

// 初始化
int InitStack(LinkStack &S) 
{
	S = NULL;   // 将栈顶指针置空
	return 1;
}

// 入栈
int Push(LinkStack &S, int e)
{
	//元素e入栈
	StackNode *p;
	p = new StackNode;  // 生成新节点
	
	p->data = e;        // 将新节点数据域置为e
	p->next = S;        // 将新节点插入栈顶
	S = p;             // 修改栈顶指针
	return 1;         // 链栈要注意指针的方向是从栈顶指向栈底的 
}

// 出栈
int Pop(LinkStack &S, int &e)
{
	if (S == NULL)
	{
		return 0;    // 栈空
	}
	e = S->data;    //将栈顶元素赋值给e
	StackNode *p;
	p = S;         // 临时保存栈顶元素空间,准备释放
	S = S->next;    // 修改栈顶指针
	delete p;     // 释放原栈顶元素空间
	return 1;
}

// 取栈顶元素
int GetTop(LinkStack S)
{
	//返回S的栈顶元素,不修改栈顶指针
	if (S != NULL)  // 栈非空
		return S->data;  // 返回栈顶元素的值,栈顶指针不变
}

void TraveStack(LinkStack S) 
{
	StackNode *p;
	p = S;
	while (p) 
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

int main() 
{
	LinkStack S;

	if (InitStack(S)) 
	{
		printf("链栈初始化成功!\n");
	}
	else 
	{
		printf("链栈初始化失败!\n");
	}

	// 入栈
	int n;
	printf("请输入栈的元素个数:");
	scanf("%d",&n);
	for (int i = 0; i < n;)
	{
		int e;
		printf("请输入第%d个入栈的元素:",++i);
		scanf("%d", &e);
		Push(S, e);
	}
	printf("遍历栈:\n");
	TraveStack(S);

	// 出栈(取出两个元素)
	for (int i = 0; i < 2;)
	{
		int a;
		Pop(S, a);
		printf("第%d个出栈的元素:%d\n", ++i, a);
	}
	printf("遍历栈:\n");
	TraveStack(S);
	
	printf("栈顶元素是:%d\n", GetTop(S));
	
	system("pause");
	
	return 0;
}
  • 运行结果

猜你喜欢

转载自blog.csdn.net/qq_22847457/article/details/94379784