栈stack

本文介绍了栈作为线性存储结构的特性,包括先进后出原则和在栈顶进行的插入、删除操作。通过实例分析了如何使用栈解决后缀表达式计算、括号匹配、模拟栈操作和中缀表达式求值的问题。在中缀表达式求值中,提到了哈希表在处理运算优先级中的应用。
摘要由CSDN通过智能技术生成

栈的特点

1. 一种线性存储结构,先进后出。

2.限定只能在栈顶进行插入和删除操作。

s.empty();         //如果栈为空则返回true, 否则返回false;
s.size();          //返回栈中元素的个数
s.top();           //返回栈顶元素, 但不删除该元素
s.pop();           //弹出栈顶元素, 但不返回其值
s.push();          //将元素压入栈顶

例1 OJ331 后缀表达式的值

【分析】

1.考虑表达式中数的先后顺序,具体可用树状图来表示。

2.运用栈相关的操作完成加减乘除运算

【代码】

#include <bits/stdc++.h>
using namespace std;
string a;
int main(){
	stack<long long> s;//记得开long long
	getline(cin,a);
	int l=a.size();
	int i=0;//赋初值
	long long m,n;
	while(a[i]!='@'){
		switch(a[i]){
			case '+':n=s.top();s.pop();m=s.top();s.pop();s.push(m+n);break;
			case '-':n=s.top();s.pop();m=s.top();s.pop();s.push(m-n);break;
			case '*':n=s.top();s.pop();m=s.top();s.pop();s.push(m*n);break;
			case '/':n=s.top();s.pop();m=s.top();s.pop();s.push(m/n);break;//运算
			default:
				long long t=0,flag=0;
				while(a[i]>='0' && a[i]<='9'){
					t=t*10+a[i]-'0';
					i++;
					flag=1;
				}
				if(flag) s.push(t);//如果是数字 入栈
				break;
		} 
		i++;//下一位
	}
	cout<<s.top() ;
	return 0;
}

例2 OJ353 表达式括号匹配

【分析】

先考虑将左括号放入栈中(可以直接用别的数代替),再用右括号进行配对。不能先使右括号入栈,那样的运算是非法的。当栈不为空时,每一个右括号

好的,这个问题非常适合用程序解决。以下是用stack实现简单计算器的c代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #define STACKLEN 1000 /* 的最大容量 */ typedef struct { int top; /* 顶指针 */ double data[STACKLEN]; /* 元素数组 */ } Stack; void push(Stack *pstack, double value) { if (pstack->top == STACKLEN - 1) { printf("Error: stack overflow!\n"); exit(EXIT_FAILURE); } else { pstack->data[++pstack->top] = value; } } double pop(Stack *pstack) { if (pstack->top == -1) { printf("Error: stack underflow!\n"); exit(EXIT_FAILURE); } else { return pstack->data[pstack->top--]; } } bool is_digit(char c) { return (c >= '0' && c <= '9'); } int precedence(char op) { if (op == '+' || op == '-') return 1; else if (op == '*' || op == '/') return 2; else return 0; } double calculate(double left, char op, double right) { switch (op) { case '+': return left + right; case '-': return left - right; case '*': return left * right; case '/': return left / right; default: printf("Error: invalid operator!\n"); exit(EXIT_FAILURE); } } double eval(char *expr) { Stack operandStack; operandStack.top = -1; Stack operatorStack; operatorStack.top = -1; int len = strlen(expr); int i = 0; while (i < len) { char c = expr[i]; if (is_digit(c)) { double value = 0.0; while (i < len && is_digit(expr[i])) { value = value * 10.0 + (double)(expr[i] - '0'); i++; } push(&operandStack, value); } else { while (operatorStack.top != -1 && precedence(operatorStack.data[operatorStack.top]) >= precedence(c)) { char op = operatorStack.data[operatorStack.top--]; double right = pop(&operandStack); double left = pop(&operandStack); push(&operandStack, calculate(left, op, right)); } push(&operatorStack, c); i++; } } while (operatorStack.top != -1) { char op = operatorStack.data[operatorStack.top--]; double right = pop(&operandStack); double left = pop(&operandStack); push(&operandStack, calculate(left, op, right)); } return pop(&operandStack); } int main() { char s[1000]; printf("Please enter an expression: "); scanf("%s", s); double result = eval(s); printf("Result: %f\n", result); return 0; } ``` 这段代码定义了两个:一个操作数(operandStack)和一个操作符(operatorStack),通过不断入和出的操作,实现对表达式进行求值。其中,is_digit函数用于判断一个字符是否是数字;precedence函数用于比较两个运算符的优先级;calculate函数用于计算两个操作数和一个操作符的运算结果;eval函数是主函数,用于将输入的表达式转化为数字计算结果。 希望这个回答能够帮助您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值