栈应用
1.中缀-->逆波兰表示法
(1+2) * (3-4) --> 12+34-* = -3
计算机适合去做,固定套路和固定步骤的事情
过程:
把1和2入栈
遇到+,把1和2出栈,相加
把相加结果入栈
遇到3,把3入栈,遇到4,把4入栈
遇到-,把4和3出栈并相减
将相减的结果入栈
遇到*
将栈中的结果出栈,并相乘,将相乘的结果入栈
char 转 int —— int x = n - '0' ; n为字符0~9其中一个。
int 转 char —— char x= n + '0' ; n为数字0~9其中一个。
#include <iostream>
#include <cstring>
using namespace std;
void push(int c);
int pop(void);
int isempty(void);
// 栈的本质就是数组,数组是通过索引取出元素,栈是通过栈顶取出元素
int stack[512];
// 栈顶指针
int top = 0;
int main(void)
{
char a[100];
int n;
int i;
int n1,n2;
cout << "请输入一个逆波兰表达式:\n" << endl;
cin >> a;
n = strlen(a);
for(i = 0; i < n; i++)
{
// 如果是操作数
if((a[i] >= '0') && (a[i] <= '9'))
// ASC码48就是'0',也就是说'0'的值是48,而后依次是'1'到'9'。 这样正好是char型减去48就是它对应的int值。
push(a[i] - '0');// 把字符以整数存入栈中
else// 如果是操作符
{
// 如果是操作符连续两次出栈
n2 = pop();
n1 = pop();
switch(a[i])
{
case '+':
push(n1+n2);
break;
case '-':
push(n1-n2);
break;
case '*':
push(n1*n2);
break;
}
}
}
cout << "结果 = " << pop() << endl;
return 0;
}
// 入栈
void push(int c)
{
// 先赋值在自增
stack[top++] = c;
cout << "top = " << top << endl;
cout << "stack[0] = " << stack[0] << endl;
cout << "stack[1] = " << stack[1] << endl;
cout << "stack[2] = " << stack[2] << endl;
}
// 出栈,指针-1后,才能出栈
int pop(void)
{
// 先返回在自减
return stack[--top];
}
// 判断栈是否为空
int isempty(void)
{
return top == 0;
}