可以使用栈解决类似的括号问题
遍历字符串,左括号直接入栈,右括号则弹出栈顶元素(必为对应的左括号)
最终栈中只剩下左括号,依次弹出并返回对应的右括号即可
C代码如下:
运行结果如下:
输出符合范例,望采纳~
附源码:
#include <stdio.h>
#define N 10000
// 定义栈
typedef struct Stack {
char data[N]
int len
}stack
void initStack(stack *s) { // 初始化
s->len = 0
}
void push(stack *s, char c) { // 元素进栈
s->data[s->len++] = c
}
char pop(stack *s) { // 弹出栈顶元素并返回其值
s->len--
return s->data[s->len]
}
int isEmpty(stack *s) { // 判断栈是否为空
if (s->len == 0)
return 1
return 0
}
int isLeft(char c) { // 左括号返回1,右括号返回0
if (c == '(' || c == '[' || c == '{')
return 1
else
return 0
}
char getRight(char c) { // 输入左括号,返回对应右括号
if (c == '(')
return ')'
else if (c == '[')
return ']'
else
return '}'
}
int main() {
char str[N + 1] = {0}, c
scanf("%s", str)
stack st
stack *s = &st
initStack(s)
int i = 0
while (str[i] != '\0') {
c = str[i]
if (isLeft(c)) // 左括号直接入栈
push(s, c)
else { // 弹出栈顶对应的左括号
if (!isEmpty(s)) // 其实输入保证了栈始终非空
pop(s)
}
i++
} // 最终栈中都为左括号,依次弹出并输出对应的右括号即可
printf("%s", str)// 先输出原字符串
while (!isEmpty(s)) { // 再依次输出补全的右括号
c = pop(s)
printf("%c", getRight(c))
}
printf("\n")
}
这要看你算不算符号位。
正常情况下最高位是符号位,所以最高位不变,其余位数的二进制数-1(111111111110100-1=111111111110011)再取反,即000000000001100。
算上最高位符号位1,原码就是1000000000001100,对应10进制就是-12。