#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;
//}