该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#include "malloc.h"
char * changeOrder(char *s);
struct Node
{
char *data;
struct Node * link;
};
struct Node * top1 = NULL;
struct Node * top2 = NULL;
void Push1(char *s)
{
struct Node * temp = (struct Node*) malloc(sizeof(struct Node));
temp->data = s;
temp->link = top1;
top1 = temp;
}
char * Pop1()
{
struct Node * temp;
if (top1 == NULL) return "No element found!";
temp = top1;
char *s = top1->data;
top1 = top1->link;
free(temp);
return s;
}
void Push2(char *s)
{
struct Node * temp = (struct Node*) malloc(sizeof(struct Node));
temp->data = s;
temp->link = top2;
top2 = temp;
}
char * Pop2()
{
struct Node * temp;
if (top2 == NULL) return "No element found!";
temp = top2;
char *s = top2->data;
top2 = top2->link;
free(temp);
return s;
}
//If a command has more than 50 character, or doesn't have ';'
//return 0. Else return 1.
int isLegal(char *s)
{
int smallNumber = 20;
if (strlen(s) < smallNumber) smallNumber = strlen(s);
for (int i = 0; i < smallNumber; i++)
{
if (s[i] == ';')
return 1;
}
return 0;
}
//Read one command form user input.
char *readCommand(char *s, int position)
{
if (isLegal(s) == 0)
{
return "Cannot find ';' in your command or the length"
" of your command is too long, try again!";
}
static char command[20];
int num = 0;
while (s[position] != ';')
{
command[num++] = s[position++];
}
command[num++] = ';';
return command;
}
char * changeOrder(char *s)
{
static char container[100];
int num = 0;
while (num < strlen(s))
{
if (s[num] == '(')
{
Push1("(");
num++;
}
else if (s[num] == ')')
{
while (true)
{
if (Pop1() == "(") break;
Push2(Pop1());
}
while (top2 != NULL)
{
strcat_s(container, Pop2());
}
}
else
{
char *t = readCommand(s, num);
Push1(t);
puts(t);
num += strlen(t);
}
}
while (top1 != NULL)
{
char *t = Pop1();
Push2(t);
}
while (top2 != NULL)
{
strcat_s(container, Pop2());
}
return container;
}
int main()
{
static char buf[] = { "command1;command2;command3;" };
puts(changeOrder(buf));
return 0;
}