链式栈的操作步骤

#pragma once

//链式栈,带头节点,栈顶为第一个数据节点,入栈(头插)O(1),出栈(头删)O(1)

typedef int ElemType;

typedef struct StackNode

{

ElemType data;//数据域

struct StackNode* next;//指向下一个节点

}StackNode,*LinkStack;

//初始化

void InitStack(LinkStack ps);

//销毁

void Destroy(LinkStack ps);

//清空

void ClearStack(LinkStack ps);

//判空

bool IsEmpty(LinkStack ps);

//获取有效数据个数

int GetLength(LinkStack ps);

//获取栈顶元素,但不删除

bool GetTop(LinkStack ps, ElemType* rtval);

//获取栈顶元素,且删除

bool Pop(LinkStack ps, ElemType* rtval);

//入栈

bool Push(LinkStack ps, ElemType val);

#include <stdlib.h>

#include <assert.h>

#include "lstack.h"

//初始化

void InitStack(LinkStack ps)

{

assert(ps != NULL);

ps->next = NULL;

}

//销毁

void Destroy(LinkStack ps)

{

StackNode* p;

while (ps->next != NULL)//还有数据节点

{

p = ps->next;//p保存第一个数据节点

ps->next = p->next;//把p从ps中剔除

free(p);

}

}

//清空

void ClearStack(LinkStack ps)

{

Destroy(ps);

}

//判空

bool IsEmpty(LinkStack ps)

{

return ps->next == NULL;

}

//获取有效数据个数

int GetLength(LinkStack ps)

{

int count = 0;//计数器

for (StackNode* p = ps->next; p != NULL; p = p->next)//遍历所有的数据节点

count++;

return count;

}

//获取栈顶元素,但不删除

bool GetTop(LinkStack ps, ElemType* rtval)//O(1)

{

if (IsEmpty(ps))

return false;

*rtval = ps->next->data;

return true;

}

//获取栈顶元素,且删除

bool Pop(LinkStack ps, ElemType* rtval)

{

if (IsEmpty(ps))

return false;

StackNode* p = ps->next;

*rtval = p->data;

ps->next = p->next;//p从链表中剔除

free(p);

return true;

}

//入栈

bool Push(LinkStack ps, ElemType val)//O(1)

{

//创建新节点p

StackNode* p = (StackNode*)malloc(sizeof(StackNode));

assert(p != NULL);

//把val存放到新节点p

p->data = val;

//把p插入在ps头节点后面(头插)

p->next = ps->next;

ps->next = p;

return true;

}

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include"lstack.h"

#include "list.h"

//#include<vld.h>

//

//逆序输出链表的数据

void RevShow1(LinkList pl)

{

int len = GetLength(pl);

int* stack = (int*)malloc(len*sizeof(int));//栈

int top = 0;//栈顶指针,当前可以存放数据的下标

for (LNode* p = pl->next; p != NULL; p = p->next)

{

stack[top++] = p->data;//入栈

}

while (top > 0)//栈不空

{

printf("%d ",stack[--top]);//出栈

}

printf("\n");

free(stack);

}

#include <stack>//C++ STL 栈

using namespace std;//C++ 标准命名空间

void RevShow(LinkList pl)

{

stack<int> s;//栈s已经创建

for (LNode* p = pl->next; p != NULL; p = p->next)

{

s.push(p->data);//入栈

}

while (!s.empty())

{

printf("%d ", s.top()); s.pop();//删除栈顶

}

printf("\n");

}

int main()

{

LNode head;

InitList(&head);

for (int i = 0; i < 20; i++)

{

Insert_tail(&head,i);

}

RevShow(&head);

//Show(&head);

return 0;

}

//

括号匹配,例如"(){}[]([{}])"->true;"(}{)"->false;"(]"->false,力扣20题"有效的括号"

"([{([{}])}])"

算法特征:后面出现的左括号,反而先进行匹配,这种特性需要使用栈

//bool isValid1(const char* s)

//{

//StackNode ps;

//InitStack(&ps);

//char ch;

//while (*s != '\0')//遍历字符串

//{

//if (*s == '(' || *s == '[' || *s == '{')//左括号,需要入栈

//Push(&ps,*s);//入栈

//else //右括号

//{

//if (IsEmpty(&ps))//没有和右括号匹配的左括号

//{

//Destroy(&ps);

//return false;

//}

//Pop(&ps,&ch);

//if (ch == '(' && *s != ')' || ch == '[' && *s != ']' || ch == '{' && *s != '}')//括号不匹配,错误

//{

//Destroy(&ps);

//return false;

//}

//}

//s++;

//}

//

//bool flg = IsEmpty(&ps);

//Destroy(&ps);

//return flg;

//}

//

栈,可以自己定义

//bool isValid(const char* s)

//{

//char *stack = (char *)malloc(strlen(s)*sizeof(char));//栈

//int top = 0;//栈顶下标,当前可以存放数据

//char ch;

//

//while (*s != '\0')

//{

//if (*s == '(' || *s == '[' || *s == '{')//左括号,需要入栈

//{

//stack[top++] = *s; //入栈

//}

//else //右括号,出栈比较

//{

//if (top == 0)//栈空,出错

//{

//free(stack);

//return false;

//}

//

//ch = stack[--top];//出栈

//if (ch == '(' && *s != ')' || ch == '[' && *s != ']' || ch == '{' && *s != '}')//不匹配

//{

//free(stack);

//return false;

//}

//}

//s++;

//}

//

//bool flg = (top == 0);

//free(stack);

//

//return flg;

//}

//int main()

//{

//const char* str1 = "(){}[]([{}])";//匹配

//const char* str2 = "(}{)";//不匹配

//const char* str3 = "(]";//不匹配

//const char* str4 = "([{([{}])}])";//匹配

//if (isValid(str1))

//printf("%s是括号匹配\n",str1);

//else

//printf("%s是括号不匹配\n", str1);

//if (isValid(str2))

//printf("%s是括号匹配\n", str2);

//else

//printf("%s是括号不匹配\n", str2);

//if (isValid(str3))

//printf("%s是括号匹配\n", str3);

//else

//printf("%s是括号不匹配\n", str3);

//if (isValid(str4))

//printf("%s是括号匹配\n", str4);

//else

//printf("%s是括号不匹配\n", str4);

//

//return 0;

//}

//把十进制数字转成八进制,然后输出

//void DecToOct1(unsigned int n)

//{

//StackNode s;//定义栈s

//InitStack(&s);//初始化栈s

//

//while (n != 0)

//{

//Push(&s,n % 8);//"个位"入栈

//n /= 8;//丢弃"个位"

//}

//

//int val;

//while (!IsEmpty(&s))

//{

//Pop(&s,&val);//出栈

//printf("%d ",val);

//}

//printf("\n");

//Destroy(&s);//销毁栈s

//}

//

//void DecToOct(unsigned int n)

//{

//if (n > 8)

//DecToOct(n/8);

//printf("%d ",n%8);

//}

//

//int main()

//{

//DecToOct(668);

//return 0;

//}

//int main()

//{

//StackNode s;

//InitStack(&s);

//

//for (int i = 0; i < 50; i++)

//Push(&s,i);

//printf("%d\n",GetLength(&s));

//

//int val;

//GetTop(&s,&val);

//printf("%d\n",val);

//

//while (!IsEmpty(&s))

//{

//Pop(&s,&val);

//printf("%d ",val);

//}

//printf("\n");

//Destroy(&s);

Destroy(&s);

//

//return 0;

//}

//#include"sqstack.h"

//

//int main()

//{

//SqStack s;

//InitStack(&s);

//for (int i = 0; i < 20; i++)

//{

//Push(&s,i);

//}

//SElemType val;

//while (!IsEmpty(&s))

//{

//Pop(&s,&val);

//printf("%d ",val);

//}

//printf("\n");

//

//return 0;

//}

//void Fun2()

//{

//printf("begin,Fun2\n");

//printf("Bye Fun2\n");

//}

//

//void Fun1()

//{

//printf("begin,Fun1\n");

//

//Fun2();

//

//printf("Bye Fun1\n");

//}

//

//int main()

//{

//Fun1();

//return 0;

//}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值