Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите решить задачу на С++

KIR IV Знаток (494), на голосовании 9 лет назад
Пусть символ \# определен в текстовом редакторе как стирающий символ Backspace, т. е. строка abc\#d\#\#c в действительности является строкой ac. Дан текст, в котором встречается символ \#. Преобразовать его с учетом действия этого символа. Задачу требуется решить с использованием стека.
Формат входных данных
В первой и единственной строке входного файла записан текст с расставленными в нем стирающими символами \#.
Формат выходных данных
Вывести текст в преобразованном виде.
Примеры:
Вход
abc#d##c

Выход
ac
Вход
t#This 8#is Sport###arta!!111####

Выход
This is Sparta!
Дополнен 10 лет назад
Пусть символ \# определен в текстовом редакторе как стирающий символ Backspace, т. е. строка abc\#d\#\#c в действительности является строкой ac. Дан текст, в котором встречается символ \#. Преобразовать его с учетом действия этого символа. Задачу требуется решить с использованием стека.
Голосование за лучший ответ
Зло Просветленный (38819) 10 лет назад
проблема-то в чем?
берешь символ. если он не \# - в стек его. если \# - нафиг последний элемент из стека.

все
KIR IVЗнаток (494) 10 лет назад
мне именно код нужен, и если последний выкидываешь, а вдруг он тоже #?
Зло Просветленный (38819) http://www.cplusplus.com/reference/stack/stack/ нет, читай ответ внимательно: добавлять с тек только если не # - значит, # в стеке не окажется
Cyborg Terminator Мудрец (11372) 10 лет назад
#include <cstdio>
#include <cstring>
using namespace std;

struct stack_ch {
char* ptr;
int maxlen;
int cnt;
};
int stack_init(stack_ch* st, int num);
void stack_push(stack_ch* st, char ch);
void stack_clear(stack_ch* st);

int main(void){
char s[64] = "abc#d##c";
char* p, *e;

stack_ch st;
stack_init(&st, (int)strlen(s));
for(p = &s[0]; *p; ++p){
stack_push(&st, *p);
}

printf("src: %s\n", s);
printf("dst: ");
fwrite(st.ptr, sizeof(char), (size_t)st.cnt, stdout);
putchar('\n');
stack_clear(&st);

//второе слово
strcpy(s, "t#This 8#is Sport###arta!!111####");
stack_init(&st, strlen(s));
for(p = &s[0]; *p; ++p){
stack_push(&st, *p);
}
printf("\nsrc: %s\n", s);
strncpy(s, st.ptr, (size_t)st.cnt);
s[st.cnt] = '\0';
printf("dst: %s\n", s);

getchar();
return 0;
}

//инициализация стека
int stack_init(stack_ch* st, int num){
st->ptr = new char[num];
if(st->ptr == NULL)
return 0;
st->maxlen = num;
st->cnt = 0;
return 1;
}

//втолкнуть в стэк
void stack_push(stack_ch* st, char ch){
if(st->cnt < st->maxlen) {
if(ch == '#'){
if(st->cnt > 0)
--(st->cnt);
} else
st->ptr[st->cnt++] = ch;
}
}

//удаление стэка
void stack_clear(stack_ch* st){
if(st->ptr != NULL){
delete[] st->ptr;
st->ptr = NULL;
}
st->maxlen = st->cnt = 0;
}
Похожие вопросы