2.ValueStack值栈有什么用?如何在JSP页面访问值栈中root数据?Action数据如何进入值栈?
时间: 2024-05-30 13:15:18 浏览: 12
ValueStack值栈是Struts2框架中的一个重要概念,它用于存储和管理请求处理过程中的数据,可以存放Action的属性和方法,也可以存放当前请求相关的数据和常量。在JSP页面中,可以通过EL表达式访问值栈中的root数据,例如${name}表示获取值栈中root对象中名为name的属性值。Action数据可以通过Struts2框架的interceptor链将Action放入值栈中,即每个拦截器都可以向值栈中添加数据,最终将整个Action对象放入值栈中。
相关问题
栈和队列的应用—表达式求值 :编程序实现无符号表达式求值算法,编写主程序测试一下 用c语言实现
好的,以下是基于栈的无符号表达式求值算法的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXSIZE 100
// 定义栈结构体
typedef struct stack {
int data[MAXSIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack* s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack* s) {
return s->top == -1;
}
// 入栈
void push(Stack* s, int x) {
if (s->top == MAXSIZE - 1) {
printf("Stack overflow!\n");
exit(1);
}
s->data[++(s->top)] = x;
}
// 出栈
int pop(Stack* s) {
if (isEmpty(s)) {
printf("Stack underflow!\n");
exit(1);
}
return s->data[(s->top)--];
}
// 获取栈顶元素
int getTop(Stack* s) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
exit(1);
}
return s->data[s->top];
}
// 判断是否为操作符
int isOperator(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}
// 获取操作符优先级
int getPriority(char ch) {
if (ch == '*' || ch == '/') {
return 2;
}
else if (ch == '+' || ch == '-') {
return 1;
}
else {
return 0;
}
}
// 计算操作符对应的表达式值
int calculate(char op, int num1, int num2) {
switch (op) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
case '*':
return num1 * num2;
case '/':
return num1 / num2;
default:
printf("Invalid operator!\n");
exit(1);
}
}
// 计算表达式值
int evaluate(char* exp) {
Stack valueStack; // 存放数值的栈
Stack opStack; // 存放操作符的栈
initStack(&valueStack);
initStack(&opStack);
int i = 0;
while (exp[i] != '\0') {
if (isdigit(exp[i])) { // 如果是数字,直接入值栈
int num = 0;
while (isdigit(exp[i])) {
num = num * 10 + (exp[i] - '0');
i++;
}
push(&valueStack, num);
}
else if (isOperator(exp[i])) { // 如果是操作符
while (!isEmpty(&opStack) && getPriority(exp[i]) <= getPriority(getTop(&opStack))) {
// 如果操作符栈不为空,并且当前操作符的优先级小于等于栈顶操作符的优先级
char op = pop(&opStack);
int num2 = pop(&valueStack);
int num1 = pop(&valueStack);
int res = calculate(op, num1, num2);
push(&valueStack, res);
}
push(&opStack, exp[i]); // 当前操作符入操作符栈
i++;
}
else if (exp[i] == '(') { // 左括号入操作符栈
push(&opStack, exp[i]);
i++;
}
else if (exp[i] == ')') { // 右括号
while (getTop(&opStack) != '(') { // 一直弹出操作符栈中的操作符,直到遇到左括号
char op = pop(&opStack);
int num2 = pop(&valueStack);
int num1 = pop(&valueStack);
int res = calculate(op, num1, num2);
push(&valueStack, res);
}
pop(&opStack); // 弹出左括号
i++;
}
else {
printf("Invalid character!\n");
exit(1);
}
}
while (!isEmpty(&opStack)) { // 处理剩余的操作符
char op = pop(&opStack);
int num2 = pop(&valueStack);
int num1 = pop(&valueStack);
int res = calculate(op, num1, num2);
push(&valueStack, res);
}
return getTop(&valueStack); // 最终的表达式值就是数值栈的栈顶元素
}
int main() {
char exp[MAXSIZE];
printf("Please input an expression:\n");
scanf("%s", exp);
int res = evaluate(exp);
printf("The result is: %d\n", res);
return 0;
}
```
在主程序中,我们首先读入一个表达式,然后调用`evaluate`函数计算表达式的值,并输出结果。
需要注意的是,该实现中只支持正整数的四则运算,如果需要支持更多的运算类型和数据类型,需要进行相应的修改。
什么是ValueStack
ValueStack是Struts2框架中的一个重要概念,它是一个栈结构(Stack),用于保存一个Action中所有的对象(包括Action自身、Action中的成员变量、Action中调用的方法返回的对象等)。在Struts2中,所有的数据都通过ValueStack进行传递和访问,包括请求参数、ActionContext中的对象、Action中的成员变量等。ValueStack提供了一系列方法,用于访问和操作存储在栈中的对象,比如:push、pop、peek、findValue等。通过ValueStack,可以方便地访问Action中的数据,实现数据的传递和共享,同时也有助于实现Struts2的拦截器机制。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![md](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)