链栈的总结

//链栈就是单链表的结构,但输入的方式不同
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
typedef int ElemType;//元素类型为int
typedef struct StackNode * StackLink;
struct StackNode{
	//数据域
	ElemType data;
	//指针域
	StackLink next;
};

//创建
void InitStack(StackLink & S){//指针的引用传递(头指针)
	S = NULL;//构造一个空栈
	return;
}
//入栈
//入栈就是往栈顶指针S前插入节点,即从后往前建立链表
//通过创建新节点,它的next指向S,再让S=新节点(S的前驱)增长链表,栈顶指针不断变化,栈底指针为NULL
void Push(StackLink &S, ElemType e){
	StackLink p = (StackLink)malloc(sizeof(StackNode));//生成新节点
	p->data = e;//新节点置为e
	p->next = S;//将新节点插入栈顶(在头结点前插入节点)
	S = p;//修改栈顶指针为p(S永远指向栈顶)
}
//出栈
bool Pop(StackLink&S, ElemType&e){//e是代表了Pop出去的元素,事先不用scanf
	if (S == NULL)return false;
	e = S->data;
	//StackLink p = (StackLink)malloc(sizeof(StackNode));
	//p = S;
	S = S->next;
	//free(p);
	return true;
}
//取栈顶元素
bool GetTop(StackLink S){
	if (S != NULL)
		return true;
	else
		return false;
}

int main(){
	StackLink S = (StackLink)malloc(sizeof(StackNode));
	InitStack(S);
	string op[4] = { "Push", "Pop", "GetTop", "end" },str;
	ElemType p;
	while (1){
		cin >> str;
		getchar();
		if (str == op[0]){
			scanf("%d", &p);
			Push(S, p);
		}
		else if (str == op[1]){
			if (Pop(S, p))
				printf("Pop:%d\n", p);
			else
				printf("Stack is empty\n");
		}
		else if (str == op[2]){
			if (GetTop(S))
				printf("GetTop:%d\n", S->data);
			else
				printf("No ElemType\n");
		}
		else if (str == op[3]){
			while (S){
				printf("%d\n", S->data);
				S = S->next;
			}
			system("PAUSE");
			return 0;
		}
		else{
			printf("wrong\n");
		}
	}
}

输入命令

	string op[4] = { "Push", "Pop", "GetTop", "end" },str;
	ElemType p;
	while (1){
		cin >> str;
		getchar();
		if (str == op[0]){
			
		}
		else if (str == op[1]){
		
		}
		else if (str == op[2]){
			
		}
		else if (str == op[3]){
		
		}
		else{
		
		}
	}

0.结构体

链栈就是单链表,特殊的在于入栈的方式(使得先入后出)

struct StackNode{
	//数据域
	ElemType data;
	//指针域
	StackLink next;
};

1.创建

//创建
void InitStack(StackLink & S){//指针的引用传递(头指针)
	S = NULL;//构造一个空栈
	return;
}

主函数

StackLink S = (StackLink)malloc(sizeof(StackNode));
	InitStack(S);

2.入栈

//入栈就是往栈顶指针S前插入节点,即从后往前建立链表
//通过创建新节点,它的next指向S,再让S=新节点(S的前驱)增长链表,栈顶指针不断变化,栈底指针为NULL
链栈和单链表的区别

void Push(StackLink &S, ElemType e){
	StackLink p = (StackLink)malloc(sizeof(StackNode));//生成新节点
	p->data = e;//新节点置为e
	p->next = S;//将新节点插入栈顶(在头结点前插入节点)
	S = p;//修改栈顶指针为p(S永远指向栈顶)
}

主函数

if (str == op[0]){
			scanf("%d", &p);
			Push(S, p);
		}

3.出栈

bool Pop(StackLink&S, ElemType&e){//e是代表了Pop出去的元素,事先不用scanf
	if (S == NULL)return false;
	e = S->data;
	//StackLink p = (StackLink)malloc(sizeof(StackNode));
	//p = S;
	S = S->next;
	//free(p);
	return true;
}

主函数

else if (str == op[1]){
			if (Pop(S, p))
				printf("Pop:%d\n", p);
			else
				printf("Stack is empty\n");
		}

4.取栈顶元素

bool GetTop(StackLink S){
	if (S != NULL)
		return true;
	else
		return false;
}

主函数

else if (str == op[2]){
			if (GetTop(S))
				printf("GetTop:%d\n", S->data);
			else
				printf("No ElemType\n");
		}

5.退出或其他

else if (str == op[3]){
			while (S){
				printf("%d\n", S->data);
				S = S->next;
			}
			system("PAUSE");
			return 0;
		}
		else{
			printf("wrong\n");
		}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deosiree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值