#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define M 100
int stack[M]; // 初始化栈,分配一个最大容量为100的数组空间
int top; // 栈顶
// 定义入栈操作
int push(int x)
{
if (top == M) // 栈满
return 0;
stack[top] = x; // 将元素x压入栈顶
top++; // 栈顶指针+1
return 1;
}
// 定义出栈操作
int pop(int* x)
{
if (top == 0) // 如果栈顶为0,即栈空
return 0;
top--;
*x = stack[top]; // 将栈顶元素赋给x
return 1;
}
int main()
{
int x, i;
char s1[M + 1], s2[M + 1];
// 原字符串 答案字符串
// 一个用于输入,一个用于运行输出时进行对比
// 因为数组下标是从1开始的,而栈的遍历是从1开始的,所以要+1
// scanf函数是有返回值的。一般来说,它的返回值是成功读取的元素个数。
// 但当遭遇读取失败时,它的返回值便是 -1(也就是它自己返回一个EOF) 。
while (scanf("%s", s1) != EOF) // 输入字符串
{
// top == 0 栈空
for (i = 0; s1[i]; i++) // 从左到右遍历字符串
{
if (s1[i] == '(') // 若遇到左括号
{
push(i); // 将其数组下标放入堆栈中
s2[i] = ' '; // 将对应输出字符串的位置改为空格
}
else if (s1[i] == ')') // 若遇到右括号
{
if (!pop(&x)) // 如果堆栈为空,则无法找到左括号与其匹配
// 因为这个要改变元素的值,所以要加&
s2[i] = '?';
else
s2[i] = ' '; // 如果堆栈非空,则修改输出中该位置为空格
}
else
s2[i] = ' '; // 若其为其他字符,与括号匹配无关,则修改输出为空格
}
s2[i] = '\0'; // 可以直接输入下一个
while (top)
{
pop(&x); // 在循环中堆栈非空
// 如果不加这条语句,会导致下面这条语句运行不了
s2[x] = '$'; // 当字符串遍历完成时,尚在堆栈中的左括号无法匹配,则修改输出为 $
}
printf("%s\n", s2);
}
return 0;
}
输出结果示例: