栈:一种操作受限制的线性表;(只允许在一进行端插入或删除)
既然是线性表,定义既然和线性表一样;
#define maxsize 10
typedef struct
{
int data[maxsize];
int top;
}stack;
(栈的定义很多种,我们可以根据实际使用情况来定义含有不同成员的栈)同时根据栈的特点,可使用栈来解决我们日常生活中的一些题目(数组的逆置,括号的匹配问题以及栈在表达式中的应用(中缀表达式转后缀表达式))
栈的链式表达即链栈;
我们在接触一个新的知识的时候,可以先自己进行构建,链栈不过是链表和栈的结合;
链表(单):数据域和指针域;
栈:操作受限制的象形表;
两者相加:操作受限制的单链表;
所以链栈定义无疑就是单链表;
只是我们在对其进行操作的时候,只允许在一端进行插入和删除;
所以我们以前学的头插法建立单链表就是一种输入操作受限制的做法,栈(先进后出),我们只要让单链表满足以上条件即可;
链栈:仅在表头(个人认为仅在表尾进行操作也是可行的)进行操作的单链表,表中第一个节点称为栈顶节点。
括号的匹配问题:(()[] {} )数组方法;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define maxsize 10
int main()
{
char arr[maxsize];
int top = 0;
char c,d;
while (top < maxsize)
{
scanf("%c", &c);
if (c == '(' || c == '[' || c == '{')
{
arr[top] = c;
top++;
}
else if ((c==')'&&arr[top-1]=='(')||(c=='}'&&arr[top-1]=='{')||(c==']'&&arr[top-1]=='['))top--;
else return 0;
if (top == 0)return 1;
scanf("%c", &d);
}
if (top !=0 )return 0;
return 1;
}
栈在表达式中求值的应用:利用栈把中缀表达式转换为后缀表达式;(由于技术问题该代码存在很大的bug求大佬帮忙修改或求源代码,萌新泪目,谢谢)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define maxsize 10
typedef struct
{
int data[maxsize];
int top;
}stack;
typedef struct
{
char data[maxsize];
int top;
}qstck;
void push(stack& X, int d)
{
X.data[X.top] = d;
X.top++;
}
void pus1h(qstck& X, int d)
{
X.data[X.top] = d;
X.top++;
}
void out(qstck& X, int& z)
{
z = X.data[X.top - 1];
X.top--;
}
void ou1t(stack& X, int& z)
{
z = X.data[X.top - 1];
X.top--;
}
void initstack(stack& X)
{
X.top = 0;
}
void inistack(qstck& X)
{
X.top = 0;
}
int main()
{
qstck A;stack B;
inistack(A);
initstack(B);
int c = 0;
int b = 0;
char v;
while (c !=9)
{
scanf("%d", &c);
scanf("%c", &v);
if (c == '+' || c == '-' || c == '*' || c == '/')
{
if (A.top == 0)pus1h(A, c);
else if (c == '(')pus1h(A, c);
else if (c == ')')
{
for (; A.data[A.top - 1] != '(';)
{
out(A, b);
}
pus1h(A, c);
}
else if (c == '+' || c == '-')
{
if (A.data[A.top - 1] != '(')
for (; A.data[A.top - 1] != '(' && A.top != 0;)
{
out(A, b);
}
pus1h(A, c);
}
else if (c == '*' || c == '/')
{
if (A.data[A.top - 1] != '(')
for (; A.data[A.top - 1] != '(' && A.top != 0 && A.data[A.top - 1] != '+' && A.data[A.top - 1] != '-';)
{
out(A, b);
}
pus1h(A, c);
}
}
else if (b == 'd')push(B, c);
else if (b != 'd')
{
if (b == '+')
{
B.data[B.top - 1] = B.data[B.top - 2] + B.data[B.top - 1];
B.top--;
}
else if (c == '-')
{
B.data[B.top - 1] = B.data[B.top - 2] - B.data[B.top - 1];
B.top--;
}
else if (c == '*')
{
B.data[B.top - 1] = B.data[B.top - 2] * B.data[B.top - 1];
B.top--;
}
else if (c == '/')
{
B.data[B.top - 1] = B.data[B.top - 2] / B.data[B.top - 1];
B.top--;
}
}
};
if (A.top - 1 >= 0)out(A, b);
if (b != 'd')
{
if (b == '+')
{
B.data[B.top - 1] = B.data[B.top - 2] + B.data[B.top - 1];
B.top--;
}
else if (c == '-')
{
B.data[B.top - 1] = B.data[B.top - 2] - B.data[B.top - 1];
B.top--;
}
else if (c == '*')
{
B.data[B.top - 1] = B.data[B.top - 2] * B.data[B.top - 1];
B.top--;
}
else if (c == '/')
{
B.data[B.top - 1] = B.data[B.top - 2] / B.data[B.top - 1];
B.top--;
}
}
return B.data[0];
};