AOJ/数据结构习题集

时间:2023-03-08 17:26:40
ALDS1_3_A-Stack.
Description:

Write a program which reads an expression in the Reverse Polish notation and prints the computational result.

An expression in the Reverse Polish notation is calculated using a stack. To evaluate the expression, the program should read symbols in order. If the symbol is an operand, the corresponding value should be pushed into the stack. On the other hand, if the symbols is an operator, the program should pop two elements from the stack, perform the corresponding operations, then push the result in to the stack. The program should repeat this operations.

Input:

An expression is given in a line. Two consequtive symbols (operand or operator) are separated by a space character.

You can assume that +, - and * are given as the operator and an operand is a positive integer less than 106

Output:

Print the computational result in a line.

Constraints:

2 ≤ the number of operands in the expression ≤ 100

1 ≤ the number of operators in the expression ≤ 99

-1 × 109 ≤ values in the stack ≤ 109

Sample Input 1:

1 2 +

Sample Output 1:

3

Sample Input 2:

1 2 + 3 4 - *

Sample Output 2:

-3

Codes:
//#define LOCAL

#include <cstdio>
#include <cstdlib> #define maxSize 1000
char s[maxSize];
int top, S[maxSize]; void push(int x) {
S[++top] = x;
} int pop() {
--top;
return S[top+1];
} int main()
{
#ifdef LOCAL
freopen("E:\\Temp\\input.txt", "r", stdin);
freopen("E:\\Temp\\output.txt", "w", stdout);
#endif int a, b;
while(scanf("%s", s) != EOF) {
if(s[0] == '+') {
a = pop(); b = pop();
push(a+b);
} else if(s[0] == '-') {
b = pop(); a = pop();
push(a-b);
} else if(s[0] == '*') {
a = pop(); b = pop();
push(a*b);
} else push(atoi(s));
} printf("%d\n", pop()); return 0;
}
ALDS1_3_B-Queue.
Description:

For example, we have the following queue with the quantum of 100ms.

A(150) - B(80) - C(200) - D(200)

First, process A is handled for 100ms, then the process is moved to the end of the queue with the remaining time (50ms).

B(80) - C(200) - D(200) - A(50)

Next, process B is handled for 80ms. The process is completed with the time stamp of 180ms and removed from the queue.

C(200) - D(200) - A(50)

Your task is to write a program which simulates the round-robin scheduling .

Input:

n q

name1 time1

name2 time2

...

namen timen

In the first line the number of processes n and the quantum q are given separated by a single space.

In the following n lines, names and times for the n processes are given. namei and timei are separated by a single space.

Output:

For each process, prints its name and the time the process finished in order.

Constraints:

1 ≤ n ≤ 100000

1 ≤ q ≤ 1000

1 ≤ timei ≤ 50000

1 ≤ length of namei ≤ 10

1 ≤ Sum of timei ≤ 1000000

Sample Input:

5 100

p1 150

p2 80

p3 200

p4 350

p5 20

Sample Output:

p2 180

p5 400

p1 450

p3 550

p4 800

Codes:
//#define LOCAL

#include <cstdio>

int head, tail;
#define len 100010
typedef struct pp {
char name[20];
int time;
} P;
P Q[len]; void enqueue(P x) {
Q[tail] = x;
tail = (tail+1)%len;
}
P dequeue() {
P x = Q[head];
head = (head+1)%len;
return x;
}
int min(int a, int b) {return a<b?a:b;} int main()
{
#ifdef LOCAL
freopen("E:\\Temp\\input.txt", "r", stdin);
freopen("E:\\Temp\\output.txt", "w", stdout);
#endif int n, q, last = 0;
scanf("%d%d", &n, &q);
for(int i=0; i<n; ++i)
scanf("%s%d", Q[i].name, &Q[i].time); head = 0, tail = n;
while(head != tail) {
P u = dequeue();
int x = min(q, u.time);
u.time -= x; last += x;
if(u.time) enqueue(u);
else printf("%s %d\n", u.name, last);
} return 0;
}
ALDS1_3_C-DoublyLinkedList.
Description:

Your task is to implement a double linked list.

Write a program which performs the following operations:

insert x: insert an element with key x into the front of the list.

delete x: delete the first element which has the key of x from the list. If there is not such element, you need not do anything.

deleteFirst: delete the first element from the list.

deleteLast: delete the last element from the list.

Input:

The input is given in the following format:

n

command1

command2

...

commandn

In the first line, the number of operations n is given. In the following n lines, the above mentioned operations are given in the following format:

insert x

delete x

deleteFirst

deleteLast

Output:

Print all the element (key) in the list after the given operations. Two consequtive keys should be separated by a single space.

Constraints:

The number of operations ≤ 2,000,000

The number of delete operations ≤ 20

0 ≤ value of a key ≤ 109

The number of elements in the list does not exceed 106

For a delete, deleteFirst or deleteLast operation, there is at least one element in the list.

Sample Input 1:

7

insert 5

insert 2

insert 3

insert 1

delete 3

insert 6

delete 5

Sample Output 1:

6 1 2

Sample Input 2:

9

insert 5

insert 2

insert 3

insert 1

delete 3

insert 6

delete 5

deleteFirst

deleteLast

Sample Output 2:

1

Codes:
//#define LOCAL

#include <cstdio>
#include <cstring>
#include <cstdlib> struct Node{
int key;
Node *prev, *next;
};
Node *nil; Node* listSearch(int key) {
Node *cur = nil->next;
while(cur!=nil && cur->key!=key) cur = cur->next;
return cur;
} void init() {
nil = (Node *)malloc(sizeof(Node));
nil->next = nil, nil->prev = nil;
} void printList() {
Node *cur = nil->next;
int isf = 0;
while(1) {
if(cur == nil) break;
if(isf++ > 0) printf(" ");
printf("%d", cur->key);
cur = cur->next;
}
printf("\n");
} void deletNode(Node *t) {
if(t == nil) return;
t->prev->next = t->next;
t->next->prev = t->prev;
free(t);
} void deleteFirst() {deletNode(nil->next);}
void deleteLast() {deletNode(nil->prev);}
void deleteKey(int key) {deletNode(listSearch(key));} void insert(int key) {
Node *x = (Node *)malloc(sizeof(Node));
x->key = key;
x->next = nil->next, nil->next->prev = x;
nil->next = x, x->prev = nil;
} int main()
{
#ifdef LOCAL
freopen("E:\\Temp\\input.txt", "r", stdin);
freopen("E:\\Temp\\output.txt", "w", stdout);
#endif char com[20];
int key, n, i, size, np, nd;
size = np = nd = 0;
scanf("%d", &n); init();
for(i=0; i<n; ++i) {
scanf("%s%d", com, &key);
int len = strlen(com);
if(com[0] == 'i') {
insert(key);
++np, ++size;
} else if(com[0] == 'd') {
if(len > 6) {
if(com[6] == 'F') deleteFirst();
else if(com[6] == 'L') deleteLast();
} else {
deleteKey(key); ++nd;
}
--size;
}
}
printList(); return 0;
}
ALDS1_3_D-AreasOnTheCross-SectionDiagram.
Codes:
#include <iostream>
#include <stack>
#include <string>
#include <vector>
#include <algorithm>
using namespace std; int main()
{
stack<int> S1;
stack<pair<int, int> > S2;
char ch; int sum = 0;
for(int i=0; cin>>ch; ++i) {
if(ch == '\\') S1.push(i);
else if(ch=='/' && S1.size()>0) {
int j = S1.top(); S1.pop();
sum += i-j; int a = i-j;
while(S2.size()>0 && S2.top().first>j) {
a += S2.top().second; S2.pop();
}
S2.push(make_pair(j, a));
}
} vector<int> ans;
while(S2.size() > 0) {
ans.push_back(S2.top().second); S2.pop();
}
reverse(ans.begin(), ans.end());
cout << sum << endl << ans.size();
for(int i=0; i<ans.size(); ++i) cout << " " << ans[i];
cout << endl; return 0;
}