顺序栈
#include <iostream>
using namespace std;
//后进先出表 ——栈
//顺序栈
#define MaxSize 20
typedef struct
{
int data[MaxSize];
int top;
}Sqstack;
//初始化栈
void InitSqstack(Sqstack*& s)
{
s = (Sqstack*)malloc(sizeof(Sqstack));
s->top = -1;
}
//销毁栈
void Destory(Sqstack*& s)
{
free(s);
}
//判断栈是否为空
bool Stack_empty(Sqstack*&s)
{
return (s->top == -11);
}
//进栈
bool Push(Sqstack*&s,int e)
{
if (s->top == MaxSize - 1)
return false;
s->top++;
s->data[s->top] = e;
return true;
}
//出栈
int Pop(Sqstack*& s, int& e)
{
if (s->top == - 1)
return 0;
e = s->data[s->top];
s->top--;
return e;
}
//取栈顶元素
bool GetTop(Sqstack*&s,int&e)
{
if (s->top == -1)
return false;
e = s->data[s->top];
return true;
}
int main()
{
Sqstack* s;
int e;
int b[5] = {0};
int a[5] = { 1,2,3,4,5 };
InitSqstack(s);
for (int i = 4; i >=0; i--)
Push(s, a[i]);
while (s->top != -1)
cout << Pop(s, e);
return 0;
}
链栈的实现
#include <iostream>
using namespace std;
//后进先出表 ——栈
//链栈
typedef struct linknode
{
int data;
struct linknode *next;
}Linkstack;
//初始化栈
void InitSqstack(Linkstack*& s)
{
s = (Linkstack*)malloc(sizeof(Linkstack));
s->next =NULL;
}
//销毁栈
void Destory(Linkstack*& s)
{
Linkstack* p = s, * q = s->next;
while (q != NULL)
{
free(p);
p = q;
q = p->next;
}
free(p);
}
//判断栈是否为空
bool Stack_empty(Linkstack*&s)
{
return (s->next ==NULL);
}
//进栈
bool Push(Linkstack*&s,int e)
{
Linkstack* p;
p = (Linkstack*)malloc(sizeof(Linkstack));
p->data = e;
p->next = s->next;
s->next = p;
return true;
}
//出栈
int Pop(Linkstack*& s, int& e)
{
Linkstack* p;
if (s->next == NULL) //栈空的情况
return false;
p = s->next; //p指向开始结点 s永远指向栈顶的下边
e = p->data;
s->next = p->next; //删除p结点
free(p); //释放p结点
return e;
}
//取栈顶元素
bool GetTop(Linkstack*&s,int&e)
{
if (s->next == NULL) //栈空的情况
return false;
e = s->next->data;
return true;
}
int main()
{
Linkstack* s;
int e;
int b[5] = {0};
int a[5] = { 1,2,3,4,5 };
InitSqstack(s);
for (int i = 4; i >=0; i--)
Push(s, a[i]);
while (s->next!= NULL)//我的进栈元素是54321
cout << Pop(s, e);//所以出栈的时候是12345
return 0;
}
一道例题,经典的括号匹配问题,判断输入的是否是正确匹配
(( ))正确匹配
( ( ( ) )错误匹配
#include <iostream>
using namespace std;
//后进先出表 ——栈
//链栈
typedef struct linknode
{
int data;
struct linknode *next;
}Linkstack;
//初始化栈
void InitSqstack(Linkstack*& s)
{
s = (Linkstack*)malloc(sizeof(Linkstack));
s->next =NULL;
}
//销毁栈
void Destory(Linkstack*& s)
{
Linkstack* p = s, * q = s->next;
while (q != NULL)
{
free(p);
p = q;
q = p->next;
}
free(p);
}
//判断栈是否为空
bool Stack_empty(Linkstack*&s)
{
return (s->next ==NULL);
}
//进栈
bool Push(Linkstack*&s,int e)
{
Linkstack* p;
p = (Linkstack*)malloc(sizeof(Linkstack));
p->data = e;
p->next = s->next;
s->next = p;
return true;
}
//出栈
int Pop(Linkstack*& s, int& e)
{
Linkstack* p;
if (s->next == NULL) //栈空的情况
return false;
p = s->next; //p指向开始结点 s永远指向栈顶的下边
e = p->data;
s->next = p->next; //删除p结点
free(p); //释放p结点
return e;
}
//取栈顶元素
bool GetTop(Linkstack*&s,int&e)
{
if (s->next == NULL) //栈空的情况
return false;
e = s->next->data;
return true;
}
int main()
{
/*判断左右括号是否匹配 (( ))),因为我都是定义的int类型,所以
在这里用1代替左括号 2代替右括号 */
Linkstack* s;
int e,i;
bool flag=true;
int a[6] = { 1,1,1,2,2,2 };
InitSqstack(s);
for (i = 0; i < 6; i++)
{
if (a[i] == 1)
Push(s, a[i]);
else if (a[i] == 2)
{
if (GetTop(s, e) == true)
{
if (e != 1)
flag = false;
else
Pop(s, e);
}
else
flag = false;
}
}
if(!Stack_empty(s))
flag=false;
Destory(s);
if (flag)
cout << "匹配成功";
else
cout << "匹配失败";
return 0;
}