目录
1.栈(顺序存储)初始化,判空,判满,入栈,出栈,读栈顶元素,遍历输出操作
注意!!!以下代码是在c++环境中写的c代码,用了c++代码的&
1.栈(顺序存储)初始化,判空,判满,入栈,出栈,读栈顶元素,遍历输出操作
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MaxSize 10 //定义栈中元素的最大个数
//栈的顺序存储
//定义结构体
typedef struct {
int data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack;
//初始化
bool InitStack(SqStack &S) {
S.top = -1; //初始化栈顶指针
return true;
}
//判断栈是否为空
bool Empty(SqStack S) {
if (S.top == -1)
return true;
else
return false;
}
//判断栈是否满
bool FUll(SqStack S) {
if (S.top == MaxSize - 1)
return true;
else
return false;
}
//入栈,增加元素
bool Push(SqStack &S,int x) {
if (S.top==MaxSize-1) { //若栈满
return false;
}
S.data[S.top + 1] = x;
S.top = S.top + 1;
//上面的两行代码等价于这句 S.data[++S.top]=x; 表示先对S.top的值加一,再使用他的值
return true;
}
//出栈,删除元素
bool Pop(SqStack &S,int &x) {
if (S.top == -1) //若栈空
return false;
x =S.data[S.top]; //要删除的元素的数据保存到x里
S.top--;
//上面两行代码等价于 x=S.data[S.top--];
return true;
}
//读取栈顶元素的值
int GetTop(SqStack S){
if (S.top == -1) //若栈空
return -1;
int x; //用来存储栈顶元素的值
x = S.data[S.top];
return x;
}
//遍历打印栈内元素
void PrintStack(SqStack S) {
int tempTop = S.top; // 使用临时变量来遍历栈
while (tempTop != -1) {
printf("%d\n", S.data[tempTop]);
tempTop--;
}
}
int main() {
SqStack S; //声明一个顺序栈,分配空间
InitStack(S);
//验证判空操作
printf("栈是否为空:%s\n",Empty(S)?"是":"否");
printf("top值:%d\n",S.top);
//在栈内添加元素
Push(S, 1);
Push(S, 2);
Push(S, 3);
printf("当前栈内的元素为:\n");
PrintStack(S);
//删除栈内元素
int x;
Pop(S, x);
printf("删除的元素为:%d\n",x );
Pop(S, x);
printf("删除的元素为:%d\n", x);
//读取栈顶元素
x=GetTop(S);
printf("栈顶元素为:%d\n", x);
return 0;
}
结果:
2.栈(链式)
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//带头结点的链式存储的栈
//定义结构体
typedef struct LinkNode{
int data;
struct LinkNode *next; //下一个节点的指针
}SNode,*LinkStack;
//初始化链式栈
bool InitStack(LinkStack &S) {
S = (SNode*)malloc(sizeof(LinkNode));
if (S==NULL) //内存分配失败
return false;
S->next == NULL; //将指向下一个节点指针清空
return true;
}
//进栈(增加元素)
/// <summary>
/// 将元素压入链式栈中。
/// </summary>
/// <param name="S">指向栈的指针</param>
/// <param name="value">要压入栈的整数值</param>
/// <returns>如果操作成功,返回 true;否则返回 false。</returns>
bool Push(LinkStack &S, int value) {
LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
if (p == NULL||S==NULL)
return false; //内存分配失败
p->data = value; //设置新节点的数据
p->next = S->next; //新节点得下一个指针指向当前栈顶元素
S->next = p; //更新栈顶指针指向新节点
return true;
}
//出栈
bool Pop(LinkStack S,int &x) {
if (S == NULL|| S->next==NULL)
return false; //若栈空
LinkNode* p = S->next; //指向栈顶元素
x = p->data; //取出栈顶元素得数据
S->next=p->next; //更新头节点的next指针
free(p); //释放栈顶节点
return true;
}
//查,获取栈顶元素,peek窥视
bool Peek(LinkStack S,int &x) {
if (S == NULL || S->next == NULL)
return false; //若栈空
x = (S->next)->data; //获取栈顶元素
return true;
}
//判空
bool Empty(LinkStack S) {
if(S->next==NULL)
return true;
else
return false;
}
//判满
//判满:在链式栈中不需要判满,因为链栈是动态的,只受限于系统内存。
int main() {
LinkStack S;
int x;
// 初始化栈
if (InitStack(S)) {
printf("栈初始化成功!\n");
}
else {
printf("栈初始化失败!\n");
return -1;
}
// 判断栈是否为空
if (Empty(S)) {
printf("栈为空!\n");
}
else {
printf("栈不为空!\n");
}
// 压栈操作
if (Push(S, 10)) {
printf("元素 10 压入栈成功!\n");
}
else {
printf("元素 10 压入栈失败!\n");
}
if (Push(S, 20)) {
printf("元素 20 压入栈成功!\n");
}
else {
printf("元素 20 压入栈失败!\n");
}
if (Push(S, 30)) {
printf("元素 30 压入栈成功!\n");
}
else {
printf("元素 30 压入栈失败!\n");
}
// 获取栈顶元素
if (Peek(S, x)) {
printf("当前栈顶元素为: %d\n", x);
}
else {
printf("获取栈顶元素失败!\n");
}
// 出栈操作
if (Pop(S, x)) {
printf("出栈成功,出栈元素为: %d\n", x);
}
else {
printf("出栈失败!\n");
}
// 再次获取栈顶元素
if (Peek(S, x)) {
printf("当前栈顶元素为: %d\n", x);
}
else {
printf("获取栈顶元素失败!\n");
}
// 判断栈是否为空
if (Empty(S)) {
printf("栈为空!\n");
}
else {
printf("栈不为空!\n");
}
// 再次出栈操作
if (Pop(S, x)) {
printf("出栈成功,出栈元素为: %d\n", x);
}
else {
printf("出栈失败!\n");
}
// 再次判断栈是否为空
if (Empty(S)) {
printf("栈为空!\n");
}
else {
printf("栈不为空!\n");
}
}
结果:
结束啦~
觉得有用的友友帮忙点个赞呀~