0

我一直在努力编写一个Java程序,使用操作数堆栈和操作堆栈从中缀表示法转换为前缀表示法。我已经实现了一个基于伪这里最多的回答工作转换器:中缀前缀时间和空间复杂度

conversion from infix to prefix

不过我现在正在想办法了时间和空间的上述算法的复杂性。

我认为空间复杂性必须是O(n),因为我们只有两个堆栈来存储它们之间共享的输入。

考虑时间复杂性,我不完全确定,是否因为必须将每个子部分从中缀转换为前缀而导致O(n^2)?我不确定这部分。

基本上我的问题是:我的空间复杂度结果是否正确,算法的时间复杂度是多少?

非常感谢!

编辑: 这是算法的伪代码:

Algorithm ConvertInfixtoPrefix 

Purpose: Convert and infix expression into a prefix expression. Begin 
// Create operand and operator stacks as empty stacks. 
Create OperandStack 
Create OperatorStack 

// While input expression still remains, read and process the next token. 

while(not an empty input expression) read next token from the input expression 

// Test if token is an operand or operator 
if (token is an operand) 
// Push operand onto the operand stack. 
    OperandStack.Push (token) 
endif 

// If it is a left parentheses or operator of higher precedence than the last, or the stack is empty, 
else if (token is '(' or OperatorStack.IsEmpty() or OperatorHierarchy(token) > OperatorHierarchy(OperatorStack.Top())) 
// push it to the operator stack 
    OperatorStack.Push (token) 
endif 

else if(token is ')') 
// Continue to pop operator and operand stacks, building 
// prefix expressions until left parentheses is found. 
// Each prefix expression is push back onto the operand 
// stack as either a left or right operand for the next operator. 
    while(OperatorStack.Top() not equal '(') 
     OperatorStack.Pop(operator) 
     OperandStack.Pop(RightOperand) 
     OperandStack.Pop(LeftOperand) 
     operand = operator + LeftOperand + RightOperand 
     OperandStack.Push(operand) 
    endwhile 

// Pop the left parthenses from the operator stack. 
OperatorStack.Pop(operator) 
endif 

else if(operator hierarchy of token is less than or equal to hierarchy of top of the operator stack) 
// Continue to pop operator and operand stack, building prefix 
// expressions until the stack is empty or until an operator at 
// the top of the operator stack has a lower hierarchy than that 
// of the token. 
    while(!OperatorStack.IsEmpty() and OperatorHierarchy(token) lessThen Or Equal to OperatorHierarchy(OperatorStack.Top())) 
     OperatorStack.Pop(operator) 
     OperandStack.Pop(RightOperand) 
     OperandStack.Pop(LeftOperand) 
     operand = operator + LeftOperand + RightOperand 
     OperandStack.Push(operand) 
    endwhile 
    // Push the lower precedence operator onto the stack 
    OperatorStack.Push(token) 
endif 
endwhile 
// If the stack is not empty, continue to pop operator and operand stacks building 
// prefix expressions until the operator stack is empty. 
while(!OperatorStack.IsEmpty()) OperatorStack.Pop(operator) 
OperandStack.Pop(RightOperand) 
OperandStack.Pop(LeftOperand) 
operand = operator + LeftOperand + RightOperand 

OperandStack.Push(operand) 
endwhile 

// Save the prefix expression at the top of the operand stack followed by popping // the  operand stack. 

print OperandStack.Top() 

OperandStack.Pop() 

End 
+1

发布您的代码或伪代码 – smk

+0

OK我已经加入我的伪代码。实际的代码要长得多,不容易理解。 –

+0

不!运行时间是O(N)。请参考这个https://stackoverflow.com/questions/5305215/what-is-the-running-time-of-the-translation-of-infix-to-postfix-using-queue-and?rq=1 –

回答

2

是的,为O(n^2)看起来是正确的 - 因为基本上你有一个外部和内部while循环。

编辑:O(m * n个),其中m < = n,但还是二次型

+0

是的它是绝对不是O(n)。它可以是O(n^2)或O(n log n)。我在想也许它是O(n log n),因为我们不会在内部while循环中每次都浏览整个输入,但我不完全确定。你怎么看? –

+1

为什么是lg(n)。我同意它不是n,而是一个子集,所以如果你想要精确的话你可以说O(m * n)。其中m <= n。但不是lgn ..只有当您处理的元素数量减半时才使用。即时假设登录到基地2当然。 – smk

+0

哦,好的。不,我不确定。我只是有点困惑,因为我看到这种说法中缀到后缀是O(n日志n),但也许它只是错误的:http://wiki.answers.com/Q/What_is_the_time_complexity_of_infix_to_post_fix_conversion_algorithm –