数据结构Stack实例(一):获取栈的最小值

题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素, 要求函数min、push以及pop的时间复杂度都是O(1)。

本题对空间复杂度没有要求,故而可以添加一个辅助栈,每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。

/**   
* @Title: MinStack.java 
* @Package stack 
* @Description: TODO 
* @author peidong  
* @date 2017-5-3 上午9:11:39 
* @version V1.0   
*/
package stack;


import java.util.Stack;


public class MinStack<T> {


private Stack<T> data;
private Stack<T> minStack;

/**

* <p>Title: </p> 
* <p>Description:构造函数
*/
public MinStack() {
data = new Stack();
minStack = new Stack();
}

/**

* @Title: min 
* @Description: 返回栈顶元素,辅助栈,最小值
* @param @return    
* @return T    
* @throws
*/
public T min(){
return minStack.peek();
}

/**

* @Title: pop 
* @Description: 弹出栈顶元素
* @param @return    
* @return T    
* @throws
*/
public T pop(){
minStack.pop();
return data.pop();
}

public void push(T t){
if(data.size() == 0){
minStack.push(t);
}else{
T minValue = min();
if(((Comparable)t).compareTo(minValue)<0)
minStack.push(t);
else
minStack.push(minValue);
}
data.push(t);
}
/** 
* @Title: main 
* @Description: 测试
* @param @param args    
* @return void    
* @throws 
*/
public static void main(String[] args) {
// TODO Auto-generated method stub


MinStack<Integer> ms = new MinStack<Integer>();
ms.push(4);
ms.push(3);
ms.push(5);
ms.push(2);
ms.push(1);

System.out.println("min:" + ms.min() + "  pop:" +ms.pop() );
System.out.println("min:" + ms.min() + "  pop:" +ms.pop() );
System.out.println("min:" + ms.min() + "  pop:" +ms.pop() );
System.out.println("min:" + ms.min() + "  pop:" +ms.pop() );
System.out.println("min:" + ms.min() + "  pop:" +ms.pop() );



}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后缀表达式 #include <iostream> #include <stack> #include <string> using namespace std; // 判断是否为数字 bool is_digit(char c) { return c >= '0' && c <= '9'; } // 判断是否为操作符 bool is_operator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } // 获取操作符的优先级 int get_priority(char op) { if (op == '+' || op == '-') { return 1; } else if (op == '*' || op == '/') { return 2; } else { return 0; } } // 将中缀表达式转换为后缀表达式 string infix_to_postfix(string infix) { string postfix; // 后缀表达式 stack<char> op_stack; // 操作符 // 遍历中缀表达式 for (int i = 0; i < infix.size(); i++) { char c = infix[i]; if (is_digit(c)) { // 如果是数字,直接加入后缀表达式 postfix += c; } else if (c == '(') { // 如果是左括号,入 op_stack.push(c); } else if (c == ')') { // 如果是右括号,弹出中操作符直到遇到左括号 while (!op_stack.empty() && op_stack.top() != '(') { postfix += op_stack.top(); op_stack.pop(); } if (!op_stack.empty()) { op_stack.pop(); // 弹出左括号 } } else if (is_operator(c)) { // 如果是操作符 // 弹出中优先级高于等于当前操作符的操作符 while (!op_stack.empty() && get_priority(op_stack.top()) >= get_priority(c)) { postfix += op_stack.top(); op_stack.pop(); } op_stack.push(c); // 当前操作符入 } } // 弹出中剩余的操作符 while (!op_stack.empty()) { postfix += op_stack.top(); op_stack.pop(); } return postfix; } int main() { string infix = "3+(4*5/(6-7))"; string postfix = infix_to_postfix(infix); cout << postfix << endl; // 345*67-/+ return 0; }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值